<> <> <> <> DIRECTORY BasicTime USING [ GMT ], LarkFeepRpcControl USING [ InterfaceRecord ], MBQueue USING [ Queue ], RefID USING [ ID ], RefQ USING [ Queue ], Rope USING [ ROPE ], RPC USING [ EncryptionKey ], ThParty USING [ PartyInfo ], Thrush USING [ ActionReport, ConversationID, ConvEventBody, EncryptionKey, InterfaceSpec, KeyTable, NB, nullConvID, nullID, nullKey, PartyID, Reason, ROPE, SHHH, SmartsID, StateInConv ], ThSmartsRpcControl, VoiceTemp USING [ IntervalSpec, IntervalSpecs, VoiceTime ], VoiceTempRpcControl USING [ InterfaceRecord ] ; FinchSmarts: CEDAR DEFINITIONS = { <> <<>> ConversationID: TYPE = Thrush.ConversationID; nullConvID: ConversationID = Thrush.nullConvID; NB: TYPE = Thrush.NB; nullID: RefID.ID = Thrush.nullID; WhoOriginated: TYPE = { unknown, us, them }; PartyID: TYPE = Thrush.PartyID; Reason: TYPE = Thrush.Reason; ROPE: TYPE = Thrush.ROPE; SHHH: TYPE = Thrush.SHHH; FinchInfo: TYPE = REF FinchInfoBody; FinchInfoBody: TYPE = MONITORED RECORD [ smartsID: Thrush.SmartsID_nullID, partyID: PartyID _ nullID, shh: SHHH_NIL, conversations: RefQ.Queue -- of ConvDescs --, requests: MBQueue.Queue, visitors: LIST OF Rope.ROPE _ NIL, stateChange: CONDITION, myName: ThSmartsRpcControl.InterfaceName _ [], myRName: ROPE _ NIL, myPassword: RPC.EncryptionKey _ NULL, voiceTemp: VoiceTempRpcControl.InterfaceRecord, <> ReportSystemState: PROC[ on: BOOL ], ReportConversationState: PROC[ nb: NB, cDesc: ConvDesc, remark: ROPE_NIL ], ReportRequestState: PROC[actionReport: Thrush.ActionReport, actionRequest: REF] <> ]; ConvDesc: TYPE = REF ConvDescBody; ConvDescBody: TYPE = RECORD [ <> situation: Thrush.ConvEventBody, -- amalgam of useful info from last-reported event <> whoOriginated: WhoOriginated _ unknown, ultimateState: Thrush.StateInConv _ idle, -- last state reached (except for idle) <> <> <> <> startTime: BasicTime.GMT_NULL, subject: ROPE_NIL, numParties: NAT_0, numActive: NAT_0, numIdle: NAT_0, partyInfo: ThParty.PartyInfo_NIL, -- Complete description as of some recent time feepInterfaceSpec: Thrush.InterfaceSpec, feepInterface: LarkFeepRpcControl.InterfaceRecord, <> pendingIntervals: VoiceTemp.IntervalSpecs _ NIL, -- requested, ~ finished or abandoned voiceTempID: RefID.ID _ nullID, -- serviceID; see FinchInfo for the interface keyTable: Thrush.KeyTable_NIL, keysMightBeDistributed: CONDITION, -- for waiting for keys to distribute, see ..Impl keysDistributed: BOOL_FALSE, <> clientData: REF _ NIL, <> << but this field is cleared once the ConvDesc leaves the FinchInfo.conversations Queue.>> originatorRecorded: BOOL_FALSE, reportComplete: BOOL_FALSE ]; <<>> <> InitFinchSmarts: PROC [ thrushInstance: Thrush.ROPE_NIL, ReportSystemState: PROC[ on: BOOL ], <> ReportConversationState: PROC[ nb: NB, cDesc: ConvDesc, remark: ROPE_NIL ], <> ReportRequestState: PROC[ actionReport: Thrush.ActionReport, actionRequest: REF ] <> ]; <> <> FinchIsRunning: PROC RETURNS [finchIsRunning: BOOL]; UninitFinchSmarts: PROC[problem: Thrush.ROPE_NIL, nb: Thrush.NB_NIL]; <> PlaceCall: PROC [ convID: Thrush.ConversationID _ nullConvID, rName: ROPE_NIL, number: ROPE_NIL, useNumber: BOOL_FALSE]; <> <> <> <> <> <> <> AnswerCall: PROC[convID: ConversationID]; DisconnectCall: PROC[ convID: ConversationID, reason: Thrush.Reason_$terminating, comment: ROPE_NIL ]; <> <> Feep: PROC[convID: ConversationID, feepString: ROPE]; <> <<>> PlaybackTuneProc: TYPE = PROC [ convID: Thrush.ConversationID, intervalSpec: VoiceTemp.IntervalSpec, key: Thrush.EncryptionKey, queueIt: BOOL_TRUE, failOK: BOOL_FALSE -- playing is optional; leave connection open if tune doesn't exist. ] RETURNS [ started: BOOL_FALSE, newConvID: Thrush.ConversationID ]; <> PlaybackTune: PlaybackTuneProc; RecordReason: TYPE = { ok, abandoned, failed, hopeless }; <> <> <> <> RecordTuneProc: TYPE = PROC[ convID: Thrush.ConversationID, useIntervalSpec: VoiceTemp.IntervalSpec_NIL, -- if supplied, it's a request to extend and includes key index useKey: Thrush.EncryptionKey _ Thrush.nullKey, -- useful only if useIntervalSpec#NI queueIt: BOOL_FALSE ] RETURNS[ nb: NB, intervalSpec: VoiceTemp.IntervalSpec, key: Thrush.EncryptionKey, newConvID: Thrush.ConversationID ]; <> <> << >> RecordTune: RecordTuneProc; StopTuneProc: TYPE = PROC[ convID: Thrush.ConversationID ]; <> StopTune: StopTuneProc; DescribeIntervalProc: TYPE = PROC[ intervalSpec: VoiceTemp.IntervalSpec, -- if supplied, it's a request to extend and includes key index minSilence: VoiceTemp.VoiceTime_1 ] RETURNS[ nb: NB, length: INT, intervals: VoiceTemp.IntervalSpecs ]; DescribeInterval: DescribeIntervalProc; <> IdentifyVisitor: PROC[visitor: Rope.ROPE]; ReleaseVisitor: PROC[visitor: Rope.ROPE]; <> <<>> <> <> <> <<>> FinchState: TYPE = { unknown, running, stopped }; Procs: TYPE = REF ProcsRecord; ProcsRecord: TYPE = RECORD [ playbackTune: PlaybackTuneProc, recordTune: RecordTuneProc, stopTune: StopTuneProc, describeInterval: DescribeIntervalProc, finchIsRunning: PROC RETURNS [isRunning: BOOL] ]; Register: PROC [finchSmartsProcs: Procs]; <> <<>> GetProcs: PROC RETURNS [Procs]; <> <<>> CurrentFinchState: PROC RETURNS [finchState: FinchState]; <> <<>> }. <<>> <> <> <> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <<>> <> <> <> <<>>