Thrush.mesa
Copyright Ó 1985, 1986, 1987, 1988 by Xerox Corporation. All rights reserved.
Last modified by D. Swinehart, February 20, 1988 3:46:01 pm PST
Basic Thrush Types
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 = {
Parties, Smarts, Conversations
PartyID: TYPE = RefID.ID;
SmartsID: TYPE = RefID.ID;
nullID: RefID.ID = RefID.nullID;
ConversationID: TYPE = Epoch;
nullConvID: ConversationID = LOOPHOLE[LONG[0]];
Scalars
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];
Conversation State Values
A party is a member of a conversation in one of the following states:
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.
reserved and parsing states are for Smarts benefit.
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;
At or below this, you're not really in the conversation.
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.
StateID: TYPE = NAT;
The basic Smarts->Party informational packet.
Credentials: TYPE = RECORD [
partyID: PartyID ← nullID,
smartsID: SmartsID ← nullID,
convID: ConversationID←nullConvID,
state: StateInConv ← $neverWas,
stateID: StateID𡤀
];
ConvEvent objects describe the progress of parties in conversations. They are used as informational values provided to Smarts in Progress reports to describe situations.
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.GMTNULL, -- when the event causing this report occurred
reason: Reason ← NIL, -- ($wontSay) for rejection, acceptance, or conditional acceptance
comment: ROPENIL  -- any human-sensible comment associated with the event.
];
Reason: TYPE = ATOM;
{
(Why things happened, among them)
$wontSay=NIL, -- no reason needed.
Non-rejections, ongoing
$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
Rejections, of various degrees of severity
$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. --
};
Report success of Smarts->Party calls
NB: TYPE = ATOM;
{
$success,   -- call succeeded, party may be in new state.
Conversation-transition codes
$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 <<The right way to complain?>>
$convNotActive, -- activity requested that is only satisfiable if requesting party active
$convStillActive -- can't destroy it if remaining connections are not orphans.,
...,
Other codes -- initialization problems, mostly
$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
};
Party type identification, back door stuff
PartyType: TYPE = ATOM; -- { $individual, $telephone, $trunk, $service, ? };
Progress reports from sound-providing services.
The Smarts implementations for services, such as the $recording or $text-to-speech service, need to be able to report the progress of requested actions (which are requested through specialized interfaces — see ThParty.RegisterActionInterface). Theoretically, a smarts for an interactive voice connection (i.e., a Lark or trunk) could issue reports, too, but no plans exist. Each report should include a unique identifier assigned by the original requestor; the same ID may appear in multiple reports. See ThParty.LookupActionInterface, ThParty.ReportAction, ThSmarts.ReportAction.
serviceID (customarily a SmartsID) uniquely identifies the service-provider within a host, since the same interface (and code) can support multiple entities. The specific service interface should include this value as a parameter.
interfaceID, if supplied, unseals and NARROWs, on the exporting machine, to the actual interface record for the implementation. Importing hosts can avoid the RPC connection by trying first to unseal and bind to this record. To be truly sure it's the right one, the importer can compare the hostHint to the importer's own net address.
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: ROPENIL -- Optional human-sensible information, a function of class.
];
actionClass is optional, but recommended. It allows the client to make better use of the report.
actionID was probably invented by the originating party, supplied to the service as a parameter to one of its procedures. It should be unique relative to the originating party and the conversation.
Encryption types
SHHH: TYPE = RPC.Conversation;
unencrypted, none: SHHH = RPC.unencrypted;
EncryptionKey: TYPE = DESFace.Key;
nullKey: EncryptionKey = DESFace.nullKey;
KeyTable: TYPE = IV.KeyTable;
}.
Swinehart, May 15, 1985 9:55:57 am PDT
Cedar 6.0, addition of prose (text-to-speech) types.
Swinehart, October 31, 1985 3:51:20 pm PST
Many enumerated types become ATOMs, for extensibility
changes to: DIRECTORY, NetAddress, StateInConv, ConvEventBody, Reason, NB, CallUrgency, AlertKind, PartyType, VoiceDirection, IntSpecType, RingEnable
Swinehart, November 7, 1985 2:00:17 pm PST
Pruned ConvEvent. Other values that used to be there may be obtained directly from databases or through new ThParty calls.
changes to: ConvEventBody, StateInConv, AlertKind, NB
Swinehart, May 9, 1986 3:23:48 pm PDT
Cedar 6.1.
changes to: DIRECTORY, VoiceSocket, NetAddress, noAddress, nullPassword
Swinehart, May 30, 1986 10:06:15 am PDT
Additions for reporting actions initiated or completed by voice services
changes to: DIRECTORY, ROPE, ConvEventBody, ActionID, ActionClass, ActionType, ActionReport, ProseSpecBody, InterfaceSpec
Swinehart, June 2, 1986 8:20:40 am PDT
Move KeyTable definition to KeyTable module.
changes to: KeyTable
Swinehart, June 3, 1986 5:37:02 pm PDT
Remove IntervalSpecs, tunes stuff; now the purview of recording service interfaces
changes to: ProseSpecBody
Swinehart, February 20, 1988 3:45:30 pm PST
Clean up, removing such attributes as CallUrgency, AlertKind; see ThParty property lists.
changes to: NB