<> <> <> <> <> <> <<>> <> <<>> DIRECTORY Rope, CrRPC USING [Handle, Object, ProcsObject, CallProc, DestroyProc, SetParametersProc, GetBulkDataXferProcProc, PutBulkDataXferProcProc, ReadBulkDataStreamProc, WriteBulkDataSegmentProc, CallContinuationProc, SetContinuationProc], CrRPCBackdoor USING [CreateClientHandleProc, RegisterCreateClientHandleProc], IO; CrRPCLoopbackImpl: CEDAR PROGRAM IMPORTS CrRPCBackdoor, IO ~ BEGIN class: ATOM = $Loopback; count: INT ¬ 0; Loopback: CrRPC.CallProc = { <<[h: CrRPC.Handle, remotePgm: CrRPC.CARD32, remotePgmVersion: CrRPC.CARD16, remoteProc: CrRPC.CARD16, putArgs: CrRPC.PutArgsProc, getResults: CrRPC.GetResultsProc, getError: CrRPC.GetErrorProc]>> push, pull: IO.STREAM; interim: Rope.ROPE; push ¬ IO.ROS[]; putArgs[h, push]; interim ¬ IO.RopeFromROS[push]; pull ¬ IO.RIS[interim]; getResults[h, pull]; IO.Close[pull]; }; Destroy: CrRPC.DestroyProc = { <<[h: CrRPC.Handle]>> NULL; }; SetParameters: CrRPC.SetParametersProc = { <<[h: CrRPC.Handle, op: ATOM, argument: REF ANY] RETURNS [hNew: CrRPC.Handle, result: REF ANY]>> RETURN[h, NIL]; }; GetBulkDataXferProc: CrRPC.GetBulkDataXferProcProc = { <<[h: CrRPC.Handle, s: STREAM] RETURNS [CrRPC.BulkDataXferProc]>> RETURN[NIL]; }; PutBulkDataXferProc: CrRPC.PutBulkDataXferProcProc = { <<[h: CrRPC.Handle, s: STREAM, proc: CrRPC.BulkDataXferProc]>> NULL; }; ReadBulkDataStream: CrRPC.ReadBulkDataStreamProc = { <<[h: CrRPC.Handle, s: STREAM, checkAbort: CrRPC.BulkDataCheckAbortProc, readValue: CrRPC.BulkDataValueProc] RETURNS [abort: BOOL]>> RETURN[FALSE]; }; WriteBulkDataSegment: CrRPC.WriteBulkDataSegmentProc = { <<[h: CrRPC.Handle, s: STREAM, checkAbort: CrRPC.BulkDataCheckAbortProc, writeValue: CrRPC.BulkDataValueProc, n: CARDINAL _ 1B (1)] RETURNS [abort: BOOL, heAborted: BOOL]>> RETURN[FALSE, FALSE]; }; CallContinuation: CrRPC.CallContinuationProc = { <<[h: CrRPC.Handle, proc: CrRPC.ContinuationProc, clientData: REF ANY]>> NULL; }; SetContinuation: CrRPC.SetContinuationProc = { <<[h: CrRPC.Handle, proc: CrRPC.ContinuationProc, clientData: REF ANY]>> NULL; }; Finalize: PROC [CrRPC.Handle] RETURNS[renewHandle: BOOL] = { RETURN[FALSE]; }; CreateLoopbackHandle: CrRPCBackdoor.CreateClientHandleProc = { <<[remote: CrRPC.RefAddress] RETURNS [CrRPC.Handle]>> handle: CrRPC.Handle ¬ NEW[CrRPC.Object]; handle.class ¬ class; handle.kind ¬ client; handle.data ¬ NIL; handle.clientData ¬ NIL; handle.procs ¬ NEW[CrRPC.ProcsObject]; handle.procs.call ¬ Loopback; handle.procs­ ¬ [ destroy: Destroy, setParameters: SetParameters, call: Loopback, getBulkDataSource: GetBulkDataXferProc, getBulkDataSink: GetBulkDataXferProc, putBulkDataSource: PutBulkDataXferProc, putBulkDataSink: PutBulkDataXferProc, readBulkDataStream: ReadBulkDataStream, writeBulkDataSegment: WriteBulkDataSegment, callContinuation: CallContinuation, setContinuation: SetContinuation, finalize: Finalize ]; RETURN[handle]; }; CrRPCBackdoor.RegisterCreateClientHandleProc[class: $Loopback, proc: CreateLoopbackHandle]; END.