DIRECTORY BasicTime USING [ GMT, nullGMT ], Lark USING [ KeyTable], LarkPlay USING [ ToneSpec], MBQueue USING [ Queue ], Pup USING [ nullSocket, Socket ], PupSocket USING [ Socket ], RefID USING [ ID ], Thrush USING [ AlertKind, CallUrgency, ConversationID, ConvEvent, Credentials, InterfaceSpec, NetAddress, NB, none, nullID, PartyID, PartyType, Reason, ROPE, SHHH, SmartsID, StateID, StateInConv ], ThParty USING [ NameReq, SmartsInterfaceRecord, SmartsProperties ] ; ThPartyPrivate: CEDAR DEFINITIONS = { PartyData: TYPE = REF PartyBody; PartyBody: TYPE = RECORD [ type: Thrush.PartyType_, -- Must be specified. numConvs: NAT _ 0, enabled: BOOL_FALSE, -- must be TRUE for party to be visible to anybody. partyActive: BOOL _ FALSE, -- if TRUE, party is active in exactly one conversation name: Thrush.ROPE, outgoing: Thrush.ROPE _ NIL, -- * reservedBy: Thrush.PartyID _ NULL, -- ** reservationTime: BasicTime.GMT _ BasicTime.nullGMT, -- *** actionInterfaces: LIST OF REF Thrush.InterfaceSpec _ NIL -- * ]; SmartsData: TYPE=REF SmartsBody; SmartsBody: TYPE = RECORD [ properties: ThParty.SmartsProperties, type: Thrush.PartyType_$telephone, interface: ThParty.SmartsInterfaceRecord, -- an RPC or direct interface shh: Thrush.SHHH, -- outgoing encryption handle; should be one for each Party-Smarts pair? For now, callee in shh is RName associated of Party that creates smarts. notifications: MBQueue.Queue, -- pending party->smarts notifications pupSocket: PupSocket.Socket _ NIL, failed: BOOL_ FALSE, -- when TRUE, smarts has already been deregistered and will vanish when last report has been made. enablesParty: BOOL _ FALSE -- when TRUE, we're contributing to party.numEnabled ]; ConversationData: TYPE = REF ConversationBody; ConversationBody: TYPE = RECORD [ convID: Thrush.ConversationID_NULL, subject: Thrush.ROPE _ NIL, urgency: Thrush.CallUrgency_NIL, alertKind: Thrush.AlertKind_NIL, timeOfID: BasicTime.GMT, -- time of last report to anyone startTime: BasicTime.GMT, conferenceHost: Thrush.NetAddress_[[0],[0], Pup.nullSocket], keyTable: Lark.KeyTable _ NIL, -- current key table for this conversation keyUses: ARRAY [0..20B) OF INT _ ALL[0], -- use counts for key table cStateBilateral: ConvState _ NIL, -- if non-NIL, a ConvState that is asserting a restriction to a bilateral conversation numParties: NAT_0, numActive: NAT_0, numIdle: NAT_0, numReportsOut: NAT_0 -- reports scheduled but not completed ]; ConvState: TYPE = REF ConvStateBody; ConvStateBody: TYPE = RECORD [ state: Thrush.StateInConv _ $neverWas, stateID: Thrush.StateID _ 0, intendedPartyID: Thrush.PartyID _ Thrush.nullID, time: BasicTime.GMT_NULL ]; outsideRingTune: LarkPlay.ToneSpec; MakeServiceRname: PROC[serviceName: Thrush.ROPE] RETURNS [serviceRname: Thrush.ROPE, serviceRnameAtom: ATOM]; GetCurrentParty: PROC[shh: Thrush.SHHH_Thrush.none, smartsID: Thrush.SmartsID] RETURNS [nb: Thrush.NB, partyID: Thrush.PartyID]; RegisterLocal: PROC[ shh: Thrush.SHHH_Thrush.none, rName: Thrush.ROPE_NIL, type: Thrush.PartyType_ $individual, clonePartyID: Thrush.PartyID_Thrush.nullID, interfaceRecord: ThParty.SmartsInterfaceRecord _ NIL, smartsID: Thrush.SmartsID _ Thrush.nullID, properties: ThParty.SmartsProperties ] RETURNS [ nb: Thrush.NB, credentials: Thrush.Credentials ]; AssignSmartsID: PROC RETURNS [smartsID: Thrush.SmartsID]; DoDescribeParty: PROC[party: ThPartyPrivate.PartyData, nameReq: ThParty.NameReq] RETURNS[ description: Thrush.ROPE ]; GetRnameFromParty: PROC[party: ThPartyPrivate.PartyData, nameReq: ThParty.NameReq_$current] RETURNS[ nb: Thrush.NB, rName: Thrush.ROPE_NIL, rAtom: ATOM_NIL ]; DoAdvance: PROC [ credentials: Thrush.Credentials, intendedPartyID: Thrush.PartyID _ Thrush.nullID, state: Thrush.StateInConv, reportToAll: BOOL_FALSE, reason: Thrush.Reason_NIL, comment: Thrush.ROPE_NIL, newInConv: BOOL, -- if TRUE, party must not be in the conversation yet . . . and vice versa bilateral: BOOL_FALSE ] RETURNS [nb: Thrush.NB, convEvent: Thrush.ConvEvent]; AlertOne: PROC[ credentials: Thrush.Credentials, calledPartyID: Thrush.PartyID, intendedPartyID: Thrush.PartyID_Thrush.nullID ] RETURNS [ nb: Thrush.NB ]; GetConvState: PROC[ conv: ConversationData, party: PartyData, createOK: BOOL_FALSE] RETURNS [convState: ConvState_NIL]; SetPoaching: PROC[party: PartyData, callingParty: PartyData_NIL]; MakeSubstitution: PROC[oldParty: PartyData, newParty: PartyData]; GetPupSocket: PROC[partyID: Thrush.PartyID] RETURNS [PupSocket.Socket]; VoiceParty: PROC[party: PartyData] RETURNS [voiceParty: PartyData ]; PartyConflict: PROC[party: PartyData, targetParty: PartyData] RETURNS [isConflict: BOOL]; UnsealConv: PROC[convID: Thrush.ConversationID] RETURNS [ conv: ConversationData ]; UnsealParty: PROC[partyID: Thrush.PartyID] RETURNS[party: PartyData]; UnsealSmarts: PROC[smartsID: Thrush.SmartsID] RETURNS[party: SmartsData]; UnsealConversation: PROC[ conv: ConversationData ]; NewId: PUBLIC PROC RETURNS [ Pup.Socket ]; }. ΌThPartyPrivate.mesa Copyright c 1985, 1986 by Xerox Corporation. All rights reserved. last modified by Swinehart, February 26, 1987 4:19:49 pm PST Definitions PartyData: data representing an individual, trunk, or voice recording within Thrush For services, this is set to the rName of the reserving party. For trunks, this is set to the rName or other description of the called party; for other parties, this is the rName of the individual the party represents. Fields used by trunk parties Registered Service action interfaces * 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 party does start the conversation. This field is also used to reserve a service party for a time before the party enters a conversation. *** This is the time at which a service party is reserved through a call to GetParty. The reservation is honored (the party isn't assigned to another caller, even though it is idle) for some reasonable amount of time, to allow the reserving client to engage it in a conversation. Implementors say SmartsBody: PUBLIC TYPE=ThPartyPrivate.SmartsBody; Explanation: Cedar now demands that non-well-known socket id's be assigned by the communications package. Multicast conference-listening demands that the socket id of the transmitting party be used as a listening id at all other parties. So that Bluejay can listen to Larks, we have to assign all actual socket id's in Thrush, by generating a socket for each smarts. This value will be re-used for every conversation. This value is also extracted into the socket field of properties. We must provide a function for extracting the actual PupSocket field from a smarts. This design demands that BluejaySmarts reside in the Thrush server machine. During the next interface party, Hal indicated we should include a range of socket numbers that clients can assign. Then some of this could get less awful. The state of a party in a conversation If non-null, party for whom call was originally intended. Another party may have eventually fielded it due either to forwarding or "visiting". Procedures Service Name is the formal descriptor of one of the voice services, such as "Recording", "Text-to-Speech", and so on. The result is "idle..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. Can't combine with ThParty.Register, because RPC complains about interfaceRecord param. Description of party Or ID of party to replicate (used to provide multiple instances of services) Identification of smarts implementation -- requires either: RPC Interface allowing an instance to be imported See ThParty.Register Or Local Interface record matching that produced by RPC Optional pre-allocated smartsID (see LarkSmartsInitImpl), Kind of Smarts being registered, and from what host nb will indicate something about what went wrong if anything did; if nb=$success, credentials contains the resulting PartyID and SmartsID. It's not good for anything until supplied to RegisterLocal, but it's a way to get a SmartsID before registration time. If party.type = $individual, computes and records the identity of the party's current voice terminal. callingParty may be supplied to allow for the caller's trunk party to be used if no other suitable voice terminal is found. See the implementation. If both parties exist, either a poacher is arriving or leaving. In either case, the oldParty might be involved in conversations that the new party should inherit. Arrange for that here. See earlier discussion about sockets. This gets the socket from the $voiceTerminal smarts associated with the specified party. If any. There's a conflict if: there exists other such that other = $Other[VoiceParty[party]] (or vice/versa), AND other # VoiceParty[targetParty], AND other or its poacher is involved in at least one conversation, not in idle state. Utilities Special ID-management operations Swinehart, May 15, 1985 6:01:06 pm PDT Cedar 6.0 changes to: PartyBody (incoming phone number removed), DIRECTORY Swinehart, May 20, 1985 1:16:41 pm PDT PartyBody is not a variant record any more. changes to: PartyBody Swinehart, May 22, 1985 10:32:47 am PDT serviceNameAtom => serviceName changes to: PartyBody Swinehart, May 22, 1985 10:41:26 am PDT changes to: MakeServiceRname, GetStdRingInfo, SetStdRingInfo, MakeServiceRname Swinehart, October 25, 1985 5:52:58 pm PDT Handle => ID (RefID's) changes to: DIRECTORY, nullID, PartyBody, ConversationBody, CFRec, GetCurrentParty, GetPartySmarts, GetStdRingInfo, SetStdRingInfo, FindOtherParty, DoDescribeParty, DoAdvance, RegisterLocal, DehandleConv, DehandleParty, DehandleSmarts Swinehart, November 7, 1985 11:57:15 am PST Remove several fields from these data structures, move socket ID to ConversationBody, modify CFRef. changes to: SmartsBody, ConversationBody, CFRec, outsideRingTune Swinehart, May 17, 1986 5:30:43 pm PDT Cedar 6.1 changes to: DIRECTORY, ConvStateBody Κ!˜šœ™Icodešœ Οmœ7™BJšœ<™J™›—J˜™JšœžœžœŸ˜"JšœžœŸ˜(Jšœ4Ÿ˜:—™$Jš œžœžœžœžœŸ˜>—J˜J˜JšœŸ,œœ™ΚJ™Ÿ™™J˜——Jšœ žœžœ ˜ JšœC™Cšœ žœžœ˜J˜%Jšœ"˜"J˜Jšœ*Ÿ˜GJšœ žœŸ’˜€JšœŸ&˜DJ˜šœžœ˜"Jšœ¬Οb œΣΟtœœ‘™©J˜—JšœžœžœŸb˜wJšœžœžœŸ4˜OJšœ˜J˜—Jšœžœžœ˜.šœžœžœ˜!Jšœžœ˜#J˜Jšœžœžœ˜Jšœžœ˜ Jšœžœ˜ J˜JšœžœŸ ˜;Jšœžœ˜Jšœ<˜