DIRECTORY BasicTime USING [ GMT --, nullGMT-- ], DESFace USING [ Key, nullKey ], GVBasics USING [ Password ], Lark USING [ ConnectionSpec, KeyTable, Machine, noMachine, VoiceSocket ], PupTypes USING [ PupHostID ], RPC USING [ Conversation, ShortROPE, unencrypted ], SafeStorage USING [ Type, unspecType ], Triples USING [ Any, Item ] ; Thrush: CEDAR DEFINITIONS = { PartyHandle: TYPE = ThHandle; ConversationHandle: TYPE = Epoch; nullConvHandle: ConversationHandle = LOOPHOLE[LONG[0]]; SmartsHandle: TYPE = ThHandle; VoiceSocket: TYPE = Lark.VoiceSocket; Machine: TYPE = Lark.Machine; noMachine: Machine = Lark.noMachine; Epoch: TYPE = BasicTime.GMT; epoch: Epoch; -- things with this epoch in them were created during this incarnation ROPE: TYPE = RPC.ShortROPE; Rname: TYPE = ROPE; Password: TYPE = GVBasics.Password; nullPassword: Password = ALL[0]; NetAddress: TYPE = Machine; TBD: TYPE=CARDINAL; -- <> Time: TYPE = BasicTime.GMT; Priorities: TYPE = LIST OF REF ANY; pERROR: -- PROGRAMMING -- ERROR; ServerError: ERROR[code: ServerProblem_unknown]; ServerProblem: TYPE = { unknown, inconsistentStructures, hiLevFault }; StateInConv: TYPE = { idle, -- Not really in the conversation (ever, or any more.) 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. pending, -- You are the called party; you are deciding whether to bother your user. maybe, -- 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." any -- Used in queries only }; StateID: TYPE = NAT; Credentials: TYPE = RECORD [ partyID: PartyHandle, smartsID: SmartsHandle, convID: ConversationHandle_nullConvHandle, stateID: StateID_0 ]; ConvEvent: TYPE = REF ConvEventBody; ConvEventBody: TYPE = RECORD [ credentials: Credentials, -- of the initiator of the event; smartsID may be null state: StateInConv _ idle, -- the state of this party in this conversation. reason: Reason _ wontSay, -- for rejection, acceptance, or conditional acceptance urgency: CallUrgency_normal, -- urgency supplied in connection attempt during this event. alertKind: AlertKind _ standard, -- connection type hint spec: Lark.ConnectionSpec _ NIL, -- if StatInConv is active or canActivate. keyTable: Lark.KeyTable _ NIL, -- whenever there's a spec conferenceHost: PupTypes.PupHostID _ [0], -- multicast conference host if non-zero intervalSpec: IntervalSpec _ NIL, -- if non-NIL, a SetInterval is being specified. address: ROPE_NIL, -- calling trunks and the like: external addressing information. time: Time _ NULL, comment: ROPE _ NIL -- any human-sensible comment associated with the event. ]; EventSequence: TYPE = REF EventSequenceBody; EventSequenceBody: TYPE = RECORD [ s: SEQUENCE size: NAT OF ConvEvent ]; Reason: TYPE = { wontSay, -- 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. 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 noParticular, -- rejected for good reason, but can't say what it is. error -- System problem caused rejection. -- }; NB: TYPE = { success, -- call succeeded, party may be in new state. stateMismatch, -- the most common problem; your information's out of date. invalidTransition, -- you can't go from the state you're in to the one you're requesting. 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. partyNotEnabled, -- named (own) party does not have a voice path yet. 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. }; Disposition: TYPE = {actedAndStop, actedAndPass--<>--, pass, willAlwaysPassThisRequest}; CallUrgency: TYPE= {junk, ifConvenient, normal, important, urgent, fire}; AlertKind: TYPE = { queryOnly, standard, intercom, whoKnows }; NumberClass: TYPE = {public, intelnet}; PartyType: TYPE = {individual, trunk, recording}; PhoneNumber: TYPE = --.--ROPE--REF PhoneNumberBody--; -- rope for now PhoneNumberBody: TYPE = RECORD [ extension: ROPE, office: ROPE, region: SELECT numberClass: NumberClass FROM public => [ area: ROPE ], intelnet => NULL, ENDCASE ]; Tune: TYPE = INT; -- the index of a "tune" or similar utterance identification. nullTune: Tune = -1; newTune: Tune = -2; VoiceTime: TYPE = INT; -- A sample number or sample count. VoiceInterval: TYPE = RECORD [ start: VoiceTime_0, -- first sample within tune to play or record. length: VoiceTime_-1 -- number of samples: -1 to play to the end. -- ]; VoiceDirection: TYPE = { play, record }; IntSpecType: TYPE = { request, started, finished }; IntervalSpec: TYPE = REF IntervalSpecBody; IntervalSpecBody: TYPE = RECORD [ tune: Tune_newTune, interval: VoiceInterval_[], keyIndex: [0..17B] _ 0, type: IntSpecType _ request, direction: VoiceDirection, intID: StateID _ 0, queueIt: BOOLEAN _ TRUE ]; ThHandle: TYPE=LONG CARDINAL; Enhandle: PROC[r: REF] RETURNS [ThHandle]; -- handle valid until killed. Rehandle, H: PROC[r: REF] RETURNS [ThHandle] = INLINE { RETURN[LOOPHOLE[r]]; }; Dehandle: PROC[h: ThHandle, type: SafeStorage.Type_SafeStorage.unspecType, insist: BOOLEAN_FALSE] RETURNS [LONG UNSPECIFIED]; KillHandle: PROC[h: ThHandle, type: SafeStorage.Type_SafeStorage.unspecType]; nullHandle: ThHandle = LOOPHOLE[NIL[REF], LONG CARDINAL]; HandleFault: ERROR[h: ThHandle]; MakeUnique: PROC[att, obj, val: Triples.Item _ Triples.Any]; SHHH: TYPE = RPC.Conversation; unencrypted, none: SHHH = RPC.unencrypted; EncryptionKey: TYPE = DESFace.Key; nullKey: EncryptionKey = DESFace.nullKey; }. ¾Thrush.mesa Last modified by D. Swinehart, February 8, 1984 12:59 pm Basic Thrush Types Parties, Smarts, Conversations Scalars Conversation State Values A party is a member of a conversation in one of the following states: reserved and parsing states are for Smarts benefit. Treat more or less like idle. Sequence number of state transition within conversation. Used as an index into the conversation log, and as a unique id to control Smarts->Party interactions. The basic Smarts->Party informational packet. ConvEvents describe the progress of parties in conversations. They are used as entries in the log of events for a conversation, labels on the arcs describing the current state of parties in a conversation, and informational values provided to Smarts in Progress reports to describe situations. (Why things happened) Non-rejections, ongoing Rejections, of various degrees of severity Report success of Smarts->Party calls Used in Party->Smarts calls to control "distribution". actedAndStop: I did it. Don't consult any other Smarts. actedAndPass: I did it. Consult others, but they should take no action, and you should pay no attention to their results, if any. pass: I can't do it this time, keep trying. willAlwaysPassThisRequest: I can't ever do this one. If all Smarts pass, let the caller know; that may or may not be OK. Conversation Guidance Values How important is this call? As parameters to ThParty.Alert and ThSmarts.Alert: queryOnly: is it likely that Alert would succeed? conversation argument can be null. standard: ring the phone, or whatever recipient would like. intercom: try to get through without ringing. whoKnows: TBD . . . it's early innings, yet. Party type identification, back door stuff Tunes: control of recording and playback Utility Types A ThHandle is a sanitized REF, which can be safely stored in other address spaces. It must be "Dehandled" before it can refer to the storage it designates. Enhandle assures that the REF survives. KillHandle removes the association between the handle and the target REF, and reduces the reference count to the target by 1. Rehandle is a semi-safe Enhandle; for it to work, the caller must know that the REF arg was obtained by a Dehandle of a still-valid ThHandle. If it doesn't work, the next Dehandle fails. Clients should define various handle types equal to Thrush.ThHandle. For legibility. If r is a REF to some concrete type, a runtime version of that type will have to be supplied to Dehandle to get the ref back. Can be used if one obtained r from Dehandle, or knows it was obtained that way. The next Dehandle will check the handle's validity again. Client can present virtually any value as a candidate handle. If it is not a currently valid handle, or if the target does not satisfy the handle's concrete type, the operation fails. Failure is indicated by returning NIL if insist is FALSE, otherwise by raising Thrush.HandleFault. Handle is no longer valid. Orphan procedure. Encryption types ÊƘJšœ ™ Jšœ8™8Jšœ™J˜šÏk ˜ Jšœ œœÏc œ˜&Jšœœ˜Jšœ œ˜Jšœœ?˜IJšœ œ˜Jšœœ*˜3Jšœ œ˜'Jšœœ˜J˜J˜—Jšœœ˜J˜šœ™J˜Jšœ œ ˜J˜Jšœœ ˜!Jšœ%œœ˜7J˜Jšœœ ˜J˜—šœ™J˜Jšœ œ˜%Jšœ œ˜J˜$J˜Jšœœ œ˜JšœžF˜TJ˜Jšœœœ ˜Jšœœœ˜Jšœ œ˜#Jšœœ˜ Jšœ œ ˜Jšœœœž9˜MJšœœ œ˜Jš œ œœœœœ˜#J˜Jšœžœœ˜ Jšœ œ˜0Jšœœ3˜FJ˜—šœ™J˜J™Ešœ œ˜Jšœž6˜>Jšœ žF˜Qšœ ž:˜DJ™R—Jšœ žP˜\Jšœ žJ˜TJšœžQ˜YJšœ žD˜NJšœ žo˜|Jšœ ž'˜0Jšœ ž,˜7Jšœž˜J˜—J˜J™Ÿšœ œœ˜J˜—J™-šœ œœ˜Jšœ˜J˜Jšœ*˜*J˜J˜—J™J™¦Jšœ œœ˜$šœ œ˜Jšœž6˜PJšœž0˜KJšœž7˜RJšœž<˜YJšœ!ž˜8Jšœœ,˜KJšœœž˜9Jšœ*ž(˜RJšœœž0˜RJšœ œœž@˜UJšœ œ˜Jšœ œœž8˜MJšœ˜J˜—Jšœœœ˜,šœœœ˜"Jšœœœœ ˜%J˜—šœœ˜™Jšœ ž˜—J˜™Jšœ žCœ˜QJšœ ž-˜:Jšœ ž ˜*—J˜™*Jšœ ž˜#JšœžY˜_Jšœž>˜FJšœž;˜OJšœ ž0˜šœ2™2J™UJ™;J™-J™,—J™—™*J™Jšœ œ˜'Jšœ œ"˜1J˜Jšœ œžžœž˜Ešœœœ˜ Jšœ œ˜Jšœœ˜ šœœ˜,Jšœœ˜Jšœ œ˜Jšœ˜ ——J˜—šœ(™(J˜Jšœœœž=˜OJšœ˜Jšœ˜Jšœ œœž#˜:šœœœ˜Jšœž.˜BJšœž/œ˜G—Jšœœ˜(Jšœ œ"˜3J˜Jšœœœ˜*šœœœ˜!J˜J˜J˜J˜Jšœ˜J˜Jšœ œœ˜—J˜—šœ ™ J˜JšœR™RJšœH™HJšœ¦™¦J™»J˜šœ œœœ˜JšœU™UJ˜—š Ïnœœœœ ž˜Hšœ~™~J™——šŸ œœœœœœœ˜OJ™ŠJ™—šŸœœ<˜JJšœ œœ˜šœœ œ˜Jšœ¸™¸Jšœb™b—J˜—šŸ œœ=˜MJšœ™J™—Jš œœœœœœ˜9Jšœ œ˜ J˜J™JšŸ œœ,˜