<> <> <> DIRECTORY BasicTime USING [ GMT ], Lark USING [ KeyTable], LarkPlay USING [ ToneSpec], RefID USING [ ID, nullID ], Thrush USING [ AlertKind, CallUrgency, ConversationHandle, ConvEvent, Credentials, Disposition, EventSequence, NB, PartyHandle, PartyType, nullHandle, Reason, RingEnable, ROPE, SHHH, SmartsHandle, StateID, StateInConv, ThHandle, Time, unencrypted ], ThSmarts USING [ SmartsProperties ], ThSmartsRpcControl USING [ InterfaceRecord, InterfaceRecordObject ] ; ThPartyPrivate: CEDAR DEFINITIONS = { LocalSmartsInterface: TYPE = ThSmartsRpcControl.InterfaceRecord; LocalSmartsBody: TYPE = ThSmartsRpcControl.InterfaceRecordObject; none: Thrush.SHHH = Thrush.unencrypted; StateInConv: TYPE = Thrush.StateInConv; nullHandle: Thrush.ThHandle = Thrush.nullHandle; RingMethod: TYPE = { standard, ownTune, bothTunes }; <> <> PartyData: TYPE = REF PartyBody; PartyBody: TYPE = RECORD [ numConvs: NAT _ 0, numSmarts: NAT _ 0, numEnabled: NAT _ 0, -- must be >0 for party to be visible to GetParty[]. actionNeeded: CONDITION, supervisor: PROCESS, supervisorGone: CONDITION, partyActive: BOOL _ FALSE, partyFailed: BOOL_FALSE, type: Thrush.PartyType_, -- Must be specified. <> <<>> ringEnable: Thrush.RingEnable _ on, -- are we noisily accepting calls? defaultRingEnable: Thrush.RingEnable _ on, -- are we noisily accepting calls? ringDo: RingMethod _ standard, -- we use the ring tune? ringTime: BasicTime.GMT_NULL, -- if not, when again? ringVolume: CARDINAL_1, -- sets up tune every time initialized ringTune: LarkPlay.ToneSpec, -- Specification of ring tune ringTuneRope: Thrush.ROPE_NIL, <> outgoing: Thrush.ROPE _ NIL, -- * reservedBy: Thrush.PartyHandle _ NULL, -- ** <> serviceName: Thrush.ROPE <> ]; <<* Set at GetParty time to called party number. This number is just what's needed to complete the call, with all alternatives removed. *x* in the number indicates the need for a pause of x 100 ms ticks.>> <<** Since GetParty custom-tailors a trunk party for the specific outgoing call before initiating a conversation, need a way to make sure that the same smarts does start the conversation.>> SmartsData: TYPE=REF SmartsBody; <> SmartsBody: TYPE = RECORD [ interface: ThSmartsRpcControl.InterfaceRecord, -- an RPC or direct interface properties: ThSmarts.SmartsProperties, type: Thrush.PartyType_individual, shh: Thrush.SHHH, -- outgoing encryption handle; should be one for each Party-Smarts pair? <> canProgress: BOOLEAN_TRUE, -- when FALSE, don't call Progress any more. enablesParty: BOOLEAN _ FALSE, -- when TRUE, we're contributing to party.numEnabled authenticated: BOOLEAN ]; ConversationData: TYPE = REF ConversationBody; ConversationBody: TYPE = RECORD [ subject: Thrush.ROPE _ NIL, numParties: NAT_0, numActive: NAT_0, creatorPartyID: Thrush.PartyHandle _ Thrush.nullHandle, urgency: Thrush.CallUrgency, alertKind: Thrush.AlertKind, currentStateID: Thrush.StateID_0, timeOfID: Thrush.Time, convID: Thrush.ConversationHandle_NULL, keyTable: Lark.KeyTable _ NIL, -- current key table for this conversation newKeyTable: BOOL_FALSE, -- IF key table has changed but not yet been posted log: Thrush.EventSequence ]; CFRef: TYPE = REF CFRec; -- Ref to party/conversation record CFRec: TYPE = RECORD [ -- One such CFRec for each Party-Conversation pair event: Thrush.ConvEvent, -- describes a state and the event that put it there. voiceSmartsID: Thrush.SmartsHandle_Thrush.nullHandle, -- the one that will carry the conversation load for this Party in this conversation sockID: LONG CARDINAL_NULL, -- local socket ID for this participant. socket: RefID.ID _ RefID.nullID, -- Needed by $service parties for short-term Cedar 6.1 accommodation lastPostedID: Thrush.StateID_0, -- last time event referring to this party was posted lastNotedID: Thrush.StateID_0 -- last time this party's smarts were informed. ]; logSizeIncrement: NAT = 16; outsideRingTune: LarkPlay.ToneSpec; <> <> There should be a function like this for each sort of smarts. This one works OK for both Lark Smarts and Lark Trunk Smarts.>> GetCurrentParty: PROC[ shh: Thrush.SHHH_Thrush.unencrypted, smartsID: Thrush.SmartsHandle] RETURNS [partyID: Thrush.PartyHandle]; <<<< Very likely this now belongs in ThParty with the other Triples-mungers>>>> GetPartySmarts: PROC[partyID: Thrush.PartyHandle, kind: ATOM] RETURNS [smartsID: Thrush.SmartsHandle]; MakeServiceRname: PROC[serviceName: Thrush.ROPE] RETURNS [serviceRname: Thrush.ROPE, serviceRnameAtom: ATOM]; <.Lark", as a ROPE and as a corresponding ATOM. This is a procedure because the service name is stored, but several clients need the atom or rope values.>> GetStdRingInfo: PROC [partyID: Thrush.PartyHandle]; SetStdRingInfo: PROC [partyID: Thrush.PartyHandle, update: BOOL_FALSE]; DistributionProc: TYPE = PROC[ smarts: SmartsData ] RETURNS [ d: Thrush.Disposition ]; -- controls whether distribution will progress. Distribute: PROC[ party: PartyData, proc: DistributionProc] RETURNS [ d: Thrush.Disposition ]; -- accept/reject/pass, depending on whether anybody did. <<>> GetEvent: PROC[conv: ConversationData, stateID: Thrush.StateID] RETURNS [ event: Thrush.ConvEvent ]; Supervisor: PROC[party: PartyData]; -- supervision process root. Supervise: PROC[party: PartyData]; -- Creates or joggles a Supervisor. Use where one would normally do a NOTIFY party.actionNeeded Verify: PROC[ credentials: Thrush.Credentials ] RETURNS [ conv: ConversationData, party: PartyData, cfRef: CFRef, nb: Thrush.NB ]; FindOtherParty: PROC[myPartyID: Thrush.PartyHandle, conv: ConversationData] RETURNS[partyID: Thrush.PartyHandle, conference: BOOL]; DoDescribeParty: PROC[partyID: Thrush.PartyHandle] RETURNS[ description: Thrush.ROPE]; DoAdvance: PROC [ smartsID: Thrush.SmartsHandle, party: PartyData, conv: ConversationData, cfRef: CFRef, state: StateInConv, reason: Thrush.Reason, comment: Thrush.ROPE_NIL ] RETURNS [nb: Thrush.NB]; <> <> RegisterLocal: PROC[partyID: Thrush.PartyHandle, interface: LocalSmartsInterface, properties: ThSmarts.SmartsProperties, oldSmartsID: Thrush.SmartsHandle_nullHandle] RETURNS [smartsID: Thrush.SmartsHandle]; <> <> <> DehandleConv: PROC[convID: Thrush.ConversationHandle] RETURNS [ conv: ConversationData ]; DehandleParty: PROC[partyID: Thrush.PartyHandle, insist: BOOLEAN_FALSE] RETURNS[party: PartyData]; DehandleSmarts: PROC[smartsID: Thrush.SmartsHandle, insist: BOOLEAN_FALSE] RETURNS[party: SmartsData]; DestroyConversation: PROC[ conv: ConversationData ]; <<>> }. <> <> <> <<>> <> <> <> <> < serviceName>> <> <> <> <<>> <<>>