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 ]
;
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.
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.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.
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
};
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.
InterfaceSpec:
TYPE =
RECORD [
-- See ThParty.RegisterActionInterface/LookupActionInterface
interfaceName: RPC.InterfaceName,
hostHint: NetAddress ← noAddress,
serviceID: RefID.ID
];
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.
];
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.
}.
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