<> <> <> <> <> DIRECTORY Atom USING [ PropList ], BasicTime USING [ GMT ], GVBasics USING [ Password ], LarkFeepRpcControl USING [ InterfaceRecord ], MBQueue USING [ Queue ], RefID USING [ ID ], Rope USING [ ROPE ], RPC USING [ EncryptionKey, InterfaceName, TimeoutEnable ], ThParty USING [ PartyInfo ], Thrush USING [ ActionReport, ConversationID, ConvEventBody, InterfaceSpec, NB, nullConvID, nullID, PartyID, Reason, ROPE, SHHH, SmartsID, StateInConv ], ThSmartsRpcControl ; FinchSmarts: CEDAR DEFINITIONS = { <> <<>> ConversationID: TYPE = Thrush.ConversationID; nullConvID: ConversationID = Thrush.nullConvID; NB: TYPE = Thrush.NB; nullID: RefID.ID = Thrush.nullID; WhoOriginated: TYPE = INT; -- the index of the originating party unknown: WhoOriginated = -1; us: WhoOriginated = 0; < 0;>> PartyID: TYPE = Thrush.PartyID; Reason: TYPE = Thrush.Reason; ROPE: TYPE = Thrush.ROPE; SHHH: TYPE = Thrush.SHHH; PD: TYPE = RECORD [ -- Global values for all Finch instances doReports: BOOL_FALSE, doNice: BOOL_FALSE, doPollingTimeouts: BOOL_TRUE, pollDefault: INT _ 300, -- 5 minutes minimum between probes when disconnected timeoutEnable: RPC.TimeoutEnable _ always, maxTransmissions: CARDINAL _ 6, timeoutInitiating: NAT _ 11, timeoutNoAction: INTEGER _ 30, timeoutJayConnect: INTEGER _ 1, jayTimeout: NAT _ 1, encryptionRequested: BOOLEAN_TRUE, smartsIsExported: BOOLEAN_FALSE, waitsForConnect: NAT_5, queueIt: BOOL_FALSE, maxProseLength: INT_1000, requests: MBQueue.Queue, -- requests to report; must be serialized across all instances interfaceName: RPC.InterfaceName _ [], enabled: BOOL_FALSE, -- client has required Finch connection connected: BOOL _ FALSE -- connection is established ]; pd: REF PD; FinchInfo: TYPE = REF FinchInfoBody; FinchInfoBody: TYPE = MONITORED RECORD [ -- Per Finch instance: one, for now smartsID: Thrush.SmartsID_nullID, partyID: PartyID _ nullID, shh: SHHH_NIL, conversations: LIST OF ConvDesc -- of ConvDescs --, stateChange: CONDITION, myName: ThSmartsRpcControl.InterfaceName _ [], myRName: ROPE _ NIL, myPassword: RPC.EncryptionKey _ NULL, prevThrushInstance: ROPE _ NIL, pollCondition: CONDITION, nextScheduledCheck: INT_0, <> systemStateSubscribers: LIST OF ReportSystemStateProc, convStateSubscribers: LIST OF ReportConversationStateProc, requestStateSubscribers: LIST OF ReportRequestStateProc ]; 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, <> clientData: REF _ NIL, <> props: Atom.PropList _ NIL, << Client-specific values, such as information used by synthesizer code and such. Placed here as a convenience for such services.>> originatorRecorded: BOOL_FALSE, reportComplete: BOOL_FALSE ]; <<>> <> InitFinchSmarts: PROC [thrushInstance: Thrush.ROPE_NIL, s: ReportSystemStateProc _ NIL, c: ReportConversationStateProc _ NIL, r: ReportRequestStateProc _ NIL, before: BOOL _ TRUE]; <> FinchIsRunning: PROC RETURNS [finchIsEnabled: BOOL, finchIsRunning: BOOL]; <> Poke: PROC; <> <<>> UninitFinchSmarts: PROC; <> 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, newState: Thrush.StateInConv _ $idle -- Can also be $failed, to terminate with fast-busy and such. ]; <> <> Feep: PROC[convID: ConversationID, feepString: ROPE]; ObtainNumbersForRName: PROC[rName: ROPE] RETURNS [fullRName: ROPE, number: ROPE, homeNumber: ROPE]; <> <<>> ServiceConnect: PROC [ serviceName: ROPE, convID: Thrush.ConversationID _ nullConvID, createOK: BOOL_TRUE ] RETURNS [ nb: NB_$success, cDesc: ConvDesc_NIL ]; <> <> ObtainServiceInterface: PROC [ serviceName: ROPE, interfaceName: ROPE, cDesc: ConvDesc_NIL ] RETURNS [ nb: NB_$success, shhh: Thrush.SHHH, interfaceSpec: Thrush.InterfaceSpec ]; <> <> <> <> IdentifyVisitor: PROC[visitor, password: Rope.ROPE, complain: BOOL _ TRUE] RETURNS [nb: NB_$success]; <> ReleaseVisitor: PROC[visitor, password: Rope.ROPE]; Problem: PROC[remark: ROPE_NIL, nb: NB_NIL]; <> <<>> FinchRegister: PROC[info: FinchInfo, interfaceName: RPC.InterfaceName] RETURNS[nb: NB]; FinchDeregister: PROC[info: FinchInfo, disable: BOOL_TRUE] RETURNS [nb: NB]; QUit: PROC[proposedNB: NB, problem: ROPE_NIL] RETURNS [nb: NB]; <> <> <<>> <> ReportSystemStateProc: TYPE = PROC[ enabled: BOOL, connected: BOOL ]; <> ReportConversationStateProc: TYPE = PROC[ nb: NB, cDesc: ConvDesc, remark: ROPE_NIL ]; <> ReportRequestStateProc: TYPE = PROC[ cDesc: ConvDesc, actionReport: Thrush.ActionReport, actionRequest: REF ] RETURNS [betterActionRequest: REF]; <> <> <<>> RegisterForReports: PROC [s: ReportSystemStateProc _ NIL, c: ReportConversationStateProc _ NIL, r: ReportRequestStateProc _ NIL, before: BOOL _ TRUE]; <> <<>> UnRegisterForReports: PROC [s: ReportSystemStateProc _ NIL, c: ReportConversationStateProc _ NIL, r: ReportRequestStateProc _ NIL]; <> <<>> ReportConversationState: PROC [nb: NB, cDesc: ConvDesc, remark: Rope.ROPE]; <> }. <<>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> < ServiceConnect>> <> <> <2 parties in conversation)>> <> <<>>