<> <> <> DIRECTORY Atom USING [ GetPropFromList, PutPropOnList ], FinchTTY, FinchSmarts USING [ ConvDesc, ObtainServiceInterface, RegisterForReports, ReportConversationStateProc, ReportRequestStateProc, ServiceConnect ], IO USING [ char ], RefID USING [ ID, nullID ], Rope USING [ ROPE ], RPC USING [ CallFailed, ImportFailed ], Thrush USING [ ConversationID, InterfaceSpec, NB, nullConvID, nullID, SHHH ], LarkTTYRpcControl USING [ ImportNewInterface, InterfaceRecord, PutRope ], VoiceUtils USING [ReportFR] ; FinchTTYImpl: CEDAR MONITOR <<Confusion about locks here and in FinchSmartsImpl; careful!>> IMPORTS IO, LarkTTYRpcControl, Atom, FinchSmarts, RPC, VoiceUtils EXPORTS FinchTTY = { <> ConvDesc: TYPE = FinchSmarts.ConvDesc; ConversationID: TYPE = Thrush.ConversationID; NB: TYPE = Thrush.NB; nullID: RefID.ID = Thrush.nullID; SHHH: TYPE = Thrush.SHHH; larkTTY: LarkTTYRpcControl.InterfaceRecord _ NIL; shhh: SHHH; LTDesc: TYPE = REF LTDescBody; LTDescBody: TYPE = RECORD [ serviceID: RefID.ID _ RefID.nullID ]; <> <<>> ConvStateReport: ENTRY FinchSmarts.ReportConversationStateProc = { <<[nb: NB, cDesc: ConvDesc, remark: ROPE]>> <> }; ReportReport: ENTRY FinchSmarts.ReportRequestStateProc = { <<[cDesc: ConvDesc, actionReport: Thrush.ActionReport, actionRequest: REF]>> <> <> ENABLE UNWIND => NULL; i: CARDINAL; c: CHAR; betterActionRequest _ actionRequest; SELECT actionReport.actionClass FROM $larktty => SELECT actionReport.actionType FROM $getchar => NULL; ENDCASE => RETURN; ENDCASE=>RETURN; i _ actionReport.actionID; c _ LOOPHOLE[i]; VoiceUtils.ReportFR["TTY Char: %g", NIL, NIL, IO.char[c]]; }; <> <<>> PutRope: PUBLIC PROC -- TAKES -- [ convID: Thrush.ConversationID_Thrush.nullConvID, rope: Rope.ROPE ] RETURNS [ nb: Thrush.NB_$success, newConvID: Thrush.ConversationID ] = { cDesc: ConvDesc; ltDesc: LTDesc; ScheduleRope: ENTRY PROC = { ENABLE { UNWIND=>NULL; RPC.CallFailed => { IF larkTTY=NIL THEN CONTINUE; larkTTY _ NIL; RETRY; -- Will attempt reconnection via main Finch connectiononce }; }; nb _ larkTTY.PutRope[shhh, cDesc.situation.self, ltDesc.serviceID, rope]; }; [nb,cDesc, ltDesc]_LarkTTYConnect[convID]; IF nb#$success THEN RETURN; -- Complain? newConvID _ cDesc.situation.self.convID; ScheduleRope[]; }; LarkTTYConnect: PROC[convID: Thrush.ConversationID] RETURNS [nb: NB, cDesc: ConvDesc, ltDesc: LTDesc] = { [nb, cDesc] _ FinchSmarts.ServiceConnect[NIL, convID]; -- Make an empty conv. if necc. IF nb#$success THEN RETURN; ltDesc _ NARROW[Atom.GetPropFromList[cDesc.props, $LarkTTYDesc]]; IF ltDesc#NIL THEN RETURN; ltDesc _ NEW[LTDescBody _ []]; cDesc.props _ Atom.PutPropOnList[cDesc.props, $LarkTTYDesc, ltDesc]; nb _ LarkTTYInterface[cDesc, ltDesc]; }; LarkTTYInterface: PROC[cDesc: ConvDesc, ltDesc: LTDesc] RETURNS [nb: NB_$success] = { interfaceSpec: Thrush.InterfaceSpec; IF larkTTY#NIL AND (ltDesc=NIL OR ltDesc.serviceID#nullID) THEN RETURN; [nb, shhh, interfaceSpec] _ FinchSmarts.ObtainServiceInterface[NIL, "LarkTTY", NIL]; <> IF nb#$success THEN RETURN; larkTTY _ LarkTTYRpcControl.ImportNewInterface[ interfaceName: interfaceSpec.interfaceName, hostHint: interfaceSpec.hostHint!RPC.ImportFailed => CONTINUE ]; IF larkTTY=NIL THEN RETURN[$noLarkTTYInterface]; IF ltDesc#NIL THEN ltDesc.serviceID _ interfaceSpec.serviceID; }; <> InitializeLarkTTY: PUBLIC PROC = { FinchSmarts.RegisterForReports[s: NIL, c: ConvStateReport, r: ReportReport, before: TRUE]; <> }; }. <<>> <> <> <<>> <<>>