Thrush.mesa
Copyright © 1985, 1986 by Xerox Corporation. All rights reserved.
Last modified by D. Swinehart, June 2, 1986 8:24:41 am PDT
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
};
Conversation Guidance Values
How important is this call?
CallUrgency: TYPE= ATOM; -- { $junk, $ifConvenient, $normal=NIL, $important, $urgent, $fire};
AlertKind: TYPE = ATOM; -- { $queryOnly, $standard=NIL, $intercom, $background, ... };
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
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.
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: 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.
Tunes: control of recording and playback
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𡤀, -- 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 };
IntID: TYPE = RECORD [
stateID: StateID ← 0, -- supplied by ThParty as interval is accepted
reqID: CARDINAL ← 0 -- supplied by requester to disambiguate intervals in the same rqst
];
nullIntID: IntID = [];
IntervalSpec: TYPE = REF IntervalSpecBody;
IntervalSpecBody: TYPE = RECORD [
tune: Tune←newTune,
interval: VoiceInterval←[],
keyIndex: [0..17B] ← 0,
type: IntSpecType ← $request,
direction: VoiceDirection,
intID: IntID ← nullIntID,
queueIt: BOOLEANTRUE,
changeNoted: BOOLEANFALSE -- For use by some clients.
];
IntervalSpecs: TYPE = LIST OF IntervalSpec;
Prose: control of text-to-speech-synthesis service
ProseSpec: TYPE = REF ProseSpecBody;
ProseSpecBody: TYPE = RECORD [
prose: ROPE,
type: IntSpecType ← request,
direction: VoiceDirection,
intID: IntID ← nullIntID,
queueIt: BOOLEANTRUE,
changeNoted: BOOLEANFALSE -- For use by some clients.
];
ProseSpecs: TYPE = LIST OF ProseSpec;
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