<<>> <> <> <> <> DIRECTORY AudioLibrary, IO, RPC USING [ EncryptionKey ], RefID, Rope USING [ROPE], ThParty, ThSmartsRpcControl USING [ InterfaceName ], Thrush USING [ ConvEventBody, ConversationID, Credentials, SmartsID, PartyID, NB, nullConvID, nullID, Reason, ROPE, SHHH, StateInConv], TonePlay; PhSmarts: CEDAR DEFINITIONS = { <> ConversationID: TYPE = Thrush.ConversationID; nullConvID: ConversationID = Thrush.nullConvID; NB: TYPE = Thrush.NB; nullID: RefID.ID = Thrush.nullID; PartyID: TYPE = Thrush.PartyID; Reason: TYPE = Thrush.Reason; ROPE: TYPE = Thrush.ROPE; SHHH: TYPE = Thrush.SHHH; lock: MONITORLOCK; PD: TYPE = RECORD [ doPollingTimeouts: BOOL¬TRUE, pollDefault: INT ¬ 300, -- 5 minutes minimum between probes when disconnected timeoutInitiating: NAT ¬ 11 ]; pd: REF PD; -- This is exported from the PhoenixSmartsImpl OpenConversations: TYPE = LIST OF ConvDesc; ConvDesc: TYPE = REF ConvDescBody; ConvDescBody: TYPE = RECORD [ <> info: PhoenixInfo, situation: Thrush.ConvEventBody, cInfo: ThParty.ConversationInfoRec, partyInfo: ThParty.PartyInfo, myPriority: Rope.ROPE, <> convMedia: ATOM¬NIL, expectedMedia: ATOM¬NIL, actualMedia: ATOM¬NIL, isConference: BOOL ¬ FALSE, doingAudio: BOOL ¬ FALSE, doingVideo: BOOL ¬ FALSE, <> stateAye: Thrush.StateInConv ¬ $neverWas, toneBuf: TonePlay.AudioBuf ¬ NIL, xmitStream: NetStreamInfoBody, <> tail: INT¬0 ]; LinkState: TYPE ~ { neverWas, unlinked, linked }; NetStreamInfo: TYPE ~ REF NetStreamInfoBody; NetStreamInfoBody: TYPE ~ MACHINE DEPENDENT RECORD [ fd: AudioLibrary.FD ¬ pseudostdin, vtAddress: AudioLibrary.IPAddress, -- Of the transmitter vtDummy: AudioLibrary.IPPort ¬ [0,0], -- (keep the debugger completely happy) vtPort: AudioLibrary.IPPort, -- of this stream. linkDummy: [0..03FFFFFFFH] ¬ 0, -- more debugger linkState: LinkState ¬ neverWas ]; PhoenixInfo: TYPE = REF PhoenixInfoBody; PhoenixInfoBody: TYPE = MONITORED RECORD [ -- Per Finch instance: one, for now smartsID: Thrush.SmartsID¬nullID, partyID: PartyID ¬ nullID, shh: SHHH¬NIL, conversations: OpenConversations ¬ NIL, myName: ThSmartsRpcControl.InterfaceName ¬ [], myRName: ROPE ¬ NIL, myPassword: RPC.EncryptionKey ¬ NULL, prevThrushInstance: ROPE ¬ NIL, pollCondition: CONDITION, nextScheduledCheck: INT¬0, lastRemoteRemark: ROPE ¬ NIL, -- print each remote remark once only <> enabled: BOOL¬FALSE, -- all levels are willing for connection to be maintained. connected: BOOL ¬ FALSE -- connection is established, and we're registered with Thrush ]; phoenixInfo: PhoenixInfo; -- global description of what's going on. <> Problem: PROC [comment: ROPE, info: PhoenixInfo, v1: IO.Value ¬ [null[]]]; Report: PROC [comment: ROPE, info: PhoenixInfo, v1: IO.Value ¬ [null[]], where: ATOM ¬ $Smarts]; <> InitPhoenixSmarts: PROC [thrushInstance: Thrush.ROPE¬NIL]; <> UnInitPhoenixSmarts: PROC[disable: BOOL¬TRUE]; PhoenixIsRunning: PROC RETURNS [phoenixIsEnabled: BOOL, phoenixIsRunning: BOOL]; RecordSystemStateFromSmartsReport: PROC[nb: NB ¬ NIL, remark: Rope.ROPE, connected: BOOL, enabled: BOOL, voicePath: BOOL, remoteRemark: Rope.ROPE ] RETURNS[echoNB: NB]; Poke: PROC; <> <<>> <> ForgetConv: PROC [cDesc: ConvDesc]; <> <> GetConv: PROC [info: PhoenixInfo, credentials: Thrush.Credentials, createOK: BOOL ¬ FALSE] RETURNS [cDesc: ConvDesc]; <> <> DBInfo: PROC[partyID: Thrush.PartyID, attribute: ATOM ¬ NIL, prevRNAtom: ATOM ¬ NIL] RETURNS [rName: Thrush.ROPE¬NIL, rNAtom: ATOM¬NIL, value: Thrush.ROPE¬NIL]; }. <> <> <<>> FindActiveConv: PROC [info: PhoenixInfo] RETURNS [cDesc: ConvDesc¬NIL]; <> <<>> MoreThanOneConversation: PROC [info: PhoenixInfo] RETURNS [BOOL ¬ FALSE]; <> MoreThanOneAudioConversation: PROC [info: PhoenixInfo] RETURNS [BOOL]; < $notified in any of the conversations that require audio device. Otherwise, it returns FALSE.>> VideoHardwareInUse: PROC [cDesc: ConvDesc] RETURNS [inUse: BOOL];