DIRECTORY
Lark USING [ KeyTable],
PupTypes USING [ PupHostID ],
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 ]
;
none: Thrush.SHHH = Thrush.unencrypted;
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: BOOL ← FALSE,
partyFailed: BOOL←FALSE,
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: BOOLEAN←TRUE, -- when FALSE, don't call Progress any more.
enablesParty: BOOLEAN ← FALSE, -- when TRUE, we're contributing to party.numEnabled
remote: BOOLEAN, -- if TRUE, need to do call timeouts in supervisor loop
authenticated: BOOLEAN
];
ConversationData: TYPE = REF ConversationBody;
ConversationBody:
TYPE =
RECORD [
subject: Thrush.ROPE ← NIL,
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
conferenceHost: PupTypes.PupHostID ← [0], -- Current-host value for conference participants
newKeyTable: BOOL←FALSE, -- 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 CARDINAL←NULL, -- 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.ROPE←NIL
] RETURNS [nb: Thrush.NB];
}.