ThPartyPrivate.mesa
last modified by Swinehart, November 4, 1983 9:25 am
DIRECTORY
Lark USING [ KeyTable],
Thrush USING [ AlertKind, CallUrgency, ConversationHandle, ConvEvent, Credentials, Disposition, EventSequence, NB, PartyHandle, PartyType, nullHandle, PhoneNumber, Reason, ROPE, SHHH, SmartsHandle, StateID, StateInConv, ThHandle, Time, unencrypted ],
ThSmarts USING [ SmartsProperties ],
ThSmartsRpcControl USING [ InterfaceRecord, InterfaceRecordObject ]
;
ThPartyPrivate: CEDAR DEFINITIONS = {
LocalSmartsInterface: TYPE = ThSmartsRpcControl.InterfaceRecord;
LocalSmartsBody: TYPE = ThSmartsRpcControl.InterfaceRecordObject;
none: Thrush.SHHH = Thrush.unencrypted;
StateInConv: TYPE = Thrush.StateInConv;
nullHandle: Thrush.ThHandle = Thrush.nullHandle;
Record Types
PartyData: data representing an individual, trunk, or voice recording within Thrush
PartyData: TYPE = REF PartyBody;
PartyBody: TYPE = RECORD [
numConvs: NAT ← 0,
numSmarts: NAT ← 0,
numEnabled: NAT ← 0, -- must be >0 for party to be visible to GetParty[].
actionNeeded: CONDITION,
supervisor: PROCESS,
supervisorGone: CONDITION,
partyActive: BOOLFALSE,
partyFailed: BOOLFALSE,
v: SELECT type: Thrush.PartyType FROM
individual=> [],
trunk => [
incoming: Thrush.PhoneNumber ←, -- << Use? >>
outgoing: Thrush.ROPE NIL], -- set at GetParty time to called party number.
This number is just what's needed to complete the call,
with all alternatives removed. *x* in the number
indicates the need for a pause of x 100 ms ticks.
recording => [ ],
Names of recording smarts interface . . . use to get mgmt interfaces
ENDCASE];
SmartsData: TYPE=REF SmartsBody;
Implementors say SmartsBody: PUBLIC TYPE=ThPartyPrivate.SmartsBody;
SmartsBody: TYPE = RECORD [
interface: ThSmartsRpcControl.InterfaceRecord, -- an RPC or direct interface
properties: ThSmarts.SmartsProperties,
type: Thrush.PartyType←individual,
shh: Thrush.SHHH, -- outgoing encryption handle; should be one for each Party-Smarts pair?
for now, callee in shh is RName associated of Party that creates smarts.
canProgress: BOOLEANTRUE, -- when FALSE, don't call Progress any more.
enablesParty: BOOLEANFALSE, -- when TRUE, we're contributing to party.numEnabled
authenticated: BOOLEAN
];
ConversationData: TYPE = REF ConversationBody;
ConversationBody: TYPE = RECORD [
subject: Thrush.ROPENIL,
numParties: NAT𡤀,
numActive: NAT𡤀,
creatorPartyID: Thrush.PartyHandle ← Thrush.nullHandle,
urgency: Thrush.CallUrgency,
alertKind: Thrush.AlertKind,
currentStateID: Thrush.StateID𡤀,
timeOfID: Thrush.Time,
convID: Thrush.ConversationHandle←NULL,
keyTable: Lark.KeyTable ← NIL, -- current key table for this conversation
newKeyTable: BOOLFALSE,  -- IF key table has changed but not yet been posted
log: Thrush.EventSequence
];
CFRef: TYPE = REF CFRec; -- Ref to party/conversation record
CFRec: TYPE = RECORD [ -- One such CFRec for each Party-Conversation pair
event: Thrush.ConvEvent, -- describes a state and the event that put it there.
voiceSmartsID: Thrush.SmartsHandle←Thrush.nullHandle,
-- the one that will carry the conversation load for this Party in this conversation
sockID: LONG CARDINALNULL,  -- local socket ID for this participant.
lastPostedID: Thrush.StateID𡤀, -- last time event referring to this party was posted
lastNotedID: Thrush.StateID𡤀  -- last time this party's smarts were informed.
];
logSizeIncrement: NAT = 16;
recordingRAtom: ATOM;
Procedures
Get Party that this Smarts considers that it is currently associated with. << This might not be an adequate facility; may need an enumerator to get all connections, as well; quite likely, actually. >> There should be a function like this for each sort of smarts. This one works OK for both Lark Smarts and Lark Trunk Smarts.
GetCurrentParty: PROC[
shh: Thrush.SHHH←Thrush.unencrypted,
smartsID: Thrush.SmartsHandle]
RETURNS [partyID: Thrush.PartyHandle];
<< Very likely this now belongs in ThParty with the other Triples-mungers>>
GetPartySmarts: PROC[partyID: Thrush.PartyHandle, kind: ATOM]
RETURNS [smartsID: Thrush.SmartsHandle];
DistributionProc: TYPE = PROC[ smarts: SmartsData ]
RETURNS [ d: Thrush.Disposition ]; -- controls whether distribution will progress.
Distribute: PROC[ party: PartyData, proc: DistributionProc]
RETURNS [ d: Thrush.Disposition ]; -- accept/reject/pass, depending on whether anybody did.
GetEvent: PROC[conv: ConversationData, stateID: Thrush.StateID]
RETURNS [ event: Thrush.ConvEvent ];
Supervisor: PROC[party: PartyData]; -- supervision process root.
Supervise: PROC[party: PartyData]; -- Creates or joggles a Supervisor. Use where one would normally do a NOTIFY party.actionNeeded
Verify: PROC[ credentials: Thrush.Credentials
] RETURNS [
conv: ConversationData,
party: PartyData,
cfRef: CFRef,
nb: Thrush.NB ];
DoDescribeParty: PROC[partyID: Thrush.PartyHandle]
RETURNS[ description: Thrush.ROPE];
DoAdvance: PROC [
smartsID: Thrush.SmartsHandle,
party: PartyData,
conv: ConversationData,
cfRef: CFRef,
state: StateInConv,
reason: Thrush.Reason,
comment: Thrush.ROPENIL
] RETURNS [nb: Thrush.NB];
Inherited from ThPartyIn
Party Initialization
RegisterLocal: PROC[partyID: Thrush.PartyHandle, interface: LocalSmartsInterface,
properties: ThSmarts.SmartsProperties, oldSmartsID: Thrush.SmartsHandle←nullHandle]
RETURNS [smartsID: Thrush.SmartsHandle];
This is the local analog of ThParty.Register.
Conversations
Special dehandling operations
DehandleConv: PROC[convID: Thrush.ConversationHandle]
RETURNS [ conv: ConversationData ];
DehandleParty: PROC[partyID: Thrush.PartyHandle, insist: BOOLEANFALSE]
RETURNS[party: PartyData];
DehandleSmarts: PROC[smartsID: Thrush.SmartsHandle, insist: BOOLEANFALSE]
RETURNS[party: SmartsData];
DestroyConversation: PROC[ conv: ConversationData ];
}.