DIRECTORY
BasicTime USING [ GMT ],
Lark USING [ KeyTable],
LarkPlay USING [ ToneSpec],
Thrush USING [ AlertKind, CallUrgency, ConversationHandle, ConvEvent, Credentials, Disposition, EventSequence, NB, PartyHandle, PartyType, nullHandle, PhoneNumber, Reason, RingEnable, 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=> [
Ringing tune stuff
ringEnable: Thrush.RingEnable ← on, -- are we noisily accepting calls?
defaultRingEnable: Thrush.RingEnable ← on, -- are we noisily accepting calls?
ringDo: RingMethod ← standard, -- we use the ring tune?
ringTime: BasicTime.GMT←NULL, -- if not, when again?
ringVolume: CARDINAL𡤁, -- sets up tune every time initialized
ringTune: LarkPlay.ToneSpec, -- Specification of ring tune
ringTuneRope: Thrush.ROPE←NIL
],
trunk => [
incoming: Thrush.PhoneNumber ←, -- << Use? >>
outgoing: Thrush.ROPE ← NIL, -- *
reservedBy: Thrush.PartyHandle ← NULL -- **
],
recording => [ ],
Names of recording smarts interface . . . use to get mgmt interfaces
ENDCASE];
* 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.
** Since GetParty custom-tailors a trunk party for the specific outgoing call before initiating a conversation, need a way to make sure that the same smarts does start the conversation.
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
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
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;
outsideRingTune: LarkPlay.ToneSpec;
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];
GetStdRingInfo: PUBLIC PROC [partyID: Thrush.PartyHandle];
SetStdRingInfo: PUBLIC PROC [partyID: Thrush.PartyHandle, update: BOOL←FALSE];
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 ];
FindOtherParty:
PROC[myPartyID: Thrush.PartyHandle, conv: ConversationData]
RETURNS[partyID: Thrush.PartyHandle, conference: BOOL];
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];
}.