<> <> <> <> DIRECTORY BasicTime USING [ GMT --, nullGMT-- ], DESFace USING [ Key, nullKey ], GVBasics USING [ Password ], IV USING [ KeyTable ], Pup USING [ Address, nullAddress ], RefID USING [ ID, nullID ], Rope USING [ ROPE ], RPC USING [ Conversation, InterfaceName, unencrypted ] ; Thrush: CEDAR DEFINITIONS = { <> PartyID: TYPE = RefID.ID; SmartsID: TYPE = RefID.ID; nullID: RefID.ID = RefID.nullID; ConversationID: TYPE = Epoch; nullConvID: ConversationID = LOOPHOLE[LONG[0]]; <> VoiceSocket: TYPE = Pup.Address; NetAddress: TYPE = Pup.Address; noAddress: NetAddress = Pup.nullAddress; Epoch: TYPE = BasicTime.GMT; epoch: Epoch; -- things with this epoch in them were created during this incarnation ROPE: TYPE= Rope.ROPE; nullPassword: GVBasics.Password = ALL[0]; <> <> StateInConv: TYPE = { neverWas, -- has not been in conversation yet. idle, -- Not really in the conversation (ever, or any more.) failed, -- State to go into to make busy signals, error tones, and so on, when can't find requested party, or when called party rejects. reserved, -- TBD at party level; restrict some operations pending outgoing conn. parsing, -- TBD at party level; may restrict additional operations. <> initiating, -- You are the calling party; attempt to contact the other party is in underway. notified, -- You are the called party; you are deciding whether to bother your user. ringback, -- You are the calling party; an attempt to arouse the other user is in progress. ringing, -- You are the called party; you are attempting to arouse your user. canActivate, -- You may become active in this conversation whenever you can get out of the one you may already be active in. active, -- You are active in this conversation. inactive -- You have put this conversation on "hold." }; notReallyInConv: StateInConv = $failed; <> <Party interactions.>> StateID: TYPE = NAT; <Party informational packet.>> Credentials: TYPE = RECORD [ partyID: PartyID _ nullID, smartsID: SmartsID _ nullID, convID: ConversationID_nullConvID, state: StateInConv _ $neverWas, stateID: StateID_0 ]; <<>> <> ConvEvent: TYPE = REF ConvEventBody; ConvEventBody: TYPE = RECORD [ self: Credentials, -- of the receiver of the report other: Credentials, -- of the initiator of the event; smartsID may be null time: BasicTime.GMT _ NULL, -- when the event causing this report occurred reason: Reason _ NIL, -- ($wontSay) for rejection, acceptance, or conditional acceptance comment: ROPE _ NIL -- any human-sensible comment associated with the event. ]; Reason: TYPE = ATOM; <<{>> <<(Why things happened, among them)>> <<$wontSay=NIL, -- no reason needed.>> <<>> <> <<$terminating, -- there was a reason for this connection, but it's over now, by me.>> <<$withdrawing, -- would like to leave, with right to return.>> <<$noAnswer, -- Alert only: we tried, honest.>> <<$substituting, -- Not really an event; a party substitution is being reported>> <<>> <> <<$notFound, -- called party not found>> <<$busy, -- called party is active in another conversation and/or doesn't wish to accept this one.>> <<$absent, -- called party is known to be unavailable for extended period>> <<$notImportantEnough, -- connection rejected because claimed urgency was too low.>> <<$noCircuits, -- call rejected due to system resource overload>> <<$dying, -- one of the participating parties is being destroyed>> <<$noParticular, -- rejected for good reason, but can't say what it is.>> <<$error -- System problem caused rejection. -->> <<};>> <Party calls>> NB: TYPE = ATOM; <<{>> <<$success, -- call succeeded, party may be in new state.>> <<>> <> <<$stateMismatch, -- the most common problem; your information's out of date.>> <<$notInConv, -- you're not a party to this conversation, and call requires it.>> <<$noSuchConv, -- named conversation doesn't exist.>> <<$noSuchParty, -- named (own) party doesn't exist.>> <<$partyAlreadyActive, -- Not allowed to be active in two conversations>> <<$convIdle, -- not allowed to return to a conversation everyone has abandoned!>> <<$noSuchSmarts, -- get the drift?>> <<$noSuchParty2, -- second named (called) party doesn't exist.>> <<$narcissism, -- attempt to connect to self rejected <>>> <<$convNotActive, -- activity requested that is only satisfiable if requesting party active>> <<$convStillActive -- can't destroy it if remaining connections are not orphans.,>> <<...,>> <> <<$noIdentSupplied, -- not enough information to turn name or number into party, and so on.>> <<$noEntryFound, -- no RName information found in white pages data base for named individual.>> <<$noTrunkParty, -- corresponding to supplied party>> <<$couldntAuthenticate, -- password verification problem during initialization>> <<$couldntConnect, -- interface import or other similar problem during initialization>> <<$noNameAvailable, -- can't find the name of a party>> <<$interfaceError, -- call had an invalid parameter or combination of parameters>> <<};>> <> <<>> PartyType: TYPE = ATOM; -- { $individual, $telephone, $trunk, $service, ? }; <> <<>> <> <<>> <> <<>> <> <<>> InterfaceSpec: TYPE = RECORD [ -- See ThParty.RegisterServiceInterface/LookupServiceInterface interfaceName: RPC.InterfaceName, hostHint: NetAddress _ noAddress, serviceID: RefID.ID, interfaceID: RefID.ID _ nullID ]; ActionID: TYPE = LONG CARDINAL; -- supplied by requester, included in reports. ActionClass: TYPE = ATOM; -- { <<$playback,>> <<$recording,>> <<$synthesized,>> <<...>> <<};>> ActionType: TYPE = ATOM; -- { <<$started,>> <<$finished,>> <<$abandoned,>> <<...>> <<};>> <<>> ActionReport: TYPE = RECORD [ self: Credentials, -- of the smarts being reported to other: Credentials, -- credentials of the reporting party requestingParty: Thrush.PartyID, -- original requestor. actionID: ActionID, actionClass: ActionClass _ NIL, -- $voiceRopePlay, $prosePlay, ... actionType: ActionType, -- $started, $finished, $abandoned, ... actionInfo: ROPE_NIL -- Optional human-sensible information, a function of class. ]; <> <> <> SHHH: TYPE = RPC.Conversation; unencrypted, none: SHHH = RPC.unencrypted; EncryptionKey: TYPE = DESFace.Key; nullKey: EncryptionKey = DESFace.nullKey; KeyTable: TYPE = IV.KeyTable; }. <<>> <> <> <> <> <> <> <> <> <<>> <<>> <<>> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> <> <> <<>>