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 = { 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 = { NULL; }; SetParameters: CrRPC.SetParametersProc = { RETURN[h, NIL]; }; GetBulkDataXferProc: CrRPC.GetBulkDataXferProcProc = { RETURN[NIL]; }; PutBulkDataXferProc: CrRPC.PutBulkDataXferProcProc = { NULL; }; ReadBulkDataStream: CrRPC.ReadBulkDataStreamProc = { RETURN[FALSE]; }; WriteBulkDataSegment: CrRPC.WriteBulkDataSegmentProc = { RETURN[FALSE, FALSE]; }; CallContinuation: CrRPC.CallContinuationProc = { NULL; }; SetContinuation: CrRPC.SetContinuationProc = { NULL; }; Finalize: PROC [CrRPC.Handle] RETURNS[renewHandle: BOOL] = { RETURN[FALSE]; }; CreateLoopbackHandle: CrRPCBackdoor.CreateClientHandleProc = { 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. zCrRPCLoopbackImpl.mesa Copyright Σ 1988, 1991 by Xerox Corporation. All rights reserved. Doug Terry, November 16, 1988 2:57:12 pm PST Wes Irish, May 1, 1989 4:34:05 pm PDT Willie-Sue, November 17, 1989 12:06:10 pm PST Demers, April 26, 1990 3:35 pm PDT A Courier RPC transport that simply pipes its arguments into its results, i.e. acts as an RPC echo server. This allows one to use Sirocco-generated stubs to convert between opaque types (word sequences) and actual Cedar types. [h: CrRPC.Handle, remotePgm: CrRPC.CARD32, remotePgmVersion: CrRPC.CARD16, remoteProc: CrRPC.CARD16, putArgs: CrRPC.PutArgsProc, getResults: CrRPC.GetResultsProc, getError: CrRPC.GetErrorProc] [h: CrRPC.Handle] [h: CrRPC.Handle, op: ATOM, argument: REF ANY] RETURNS [hNew: CrRPC.Handle, result: REF ANY] [h: CrRPC.Handle, s: STREAM] RETURNS [CrRPC.BulkDataXferProc] [h: CrRPC.Handle, s: STREAM, proc: CrRPC.BulkDataXferProc] [h: CrRPC.Handle, s: STREAM, checkAbort: CrRPC.BulkDataCheckAbortProc, readValue: CrRPC.BulkDataValueProc] RETURNS [abort: BOOL] [h: CrRPC.Handle, s: STREAM, checkAbort: CrRPC.BulkDataCheckAbortProc, writeValue: CrRPC.BulkDataValueProc, n: CARDINAL _ 1B (1)] RETURNS [abort: BOOL, heAborted: BOOL] [h: CrRPC.Handle, proc: CrRPC.ContinuationProc, clientData: REF ANY] [h: CrRPC.Handle, proc: CrRPC.ContinuationProc, clientData: REF ANY] [remote: CrRPC.RefAddress] RETURNS [CrRPC.Handle] ΚΜ–(cedarcode) style•NewlineDelimiter ˜code•Mark outsideHeaderšœ™Kšœ Οeœ7™BKšœ,™,K™%K™-K™"K™Kšœγ™γK™—šΟk ˜ K˜KšœžœΨ˜γKšœžœ:˜MKšžœ˜—K˜KšΠblœžœž˜ Kšžœž˜šœž˜K˜Kšœžœ ˜Kšœžœ˜K˜šΟnœ˜Kšœ#žœžœžœ]™ΐKšœ žœžœ˜Kšœžœ˜Kšœžœžœ˜Kšœ˜Kšœ žœ˜Kšœžœžœ ˜Kšœ˜Kšžœ ˜K˜K˜—•StartOfExpansion -- [h: CrRPC.Handle]š œ˜Kšœ™Kšžœ˜K˜K˜—–` -- [h: CrRPC.Handle, op: ATOM, argument: REF ANY] RETURNS [hNew: CrRPC.Handle, result: REF ANY]š  œ˜*Kš œžœ žœžœžœžœžœ™\Kšžœžœ˜K˜K˜—–A -- [h: CrRPC.Handle, s: STREAM] RETURNS [CrRPC.BulkDataXferProc]š œ#˜6Kšœžœžœ™=Kšžœžœ˜ K˜K˜—–> -- [h: CrRPC.Handle, s: STREAM, proc: CrRPC.BulkDataXferProc]š œ#˜6Kšœžœ™:Kšžœ˜K˜—K˜–„ -- [h: CrRPC.Handle, s: STREAM, checkAbort: CrRPC.BulkDataCheckAbortProc, readValue: CrRPC.BulkDataValueProc] RETURNS [abort: BOOL]š œ"˜4KšœžœPžœ žœ™€Kšžœžœ˜K˜K˜—–¬ -- [h: CrRPC.Handle, s: STREAM, checkAbort: CrRPC.BulkDataCheckAbortProc, writeValue: CrRPC.BulkDataValueProc, n: CARDINAL _ 1B (1)] RETURNS [abort: BOOL, heAborted: BOOL]š œ$˜8Kš œžœTžœ žœ žœ žœ™¨Kšžœžœžœ˜K˜K˜—–H -- [h: CrRPC.Handle, proc: CrRPC.ContinuationProc, clientData: REF ANY]š œ ˜0Kšœ<žœžœ™DKšžœ˜K˜K˜—–H -- [h: CrRPC.Handle, proc: CrRPC.ContinuationProc, clientData: REF ANY]š œ˜.Kšœ<žœžœ™DKšžœ˜K˜K˜—š œžœžœžœ˜KšΠck1™1Kšœžœ˜)K˜K˜Kšœžœ˜Kšœžœ˜Kšœžœ˜&K˜˜K˜K˜K˜K˜'K˜%K˜'K˜%K˜'K˜+Kšœ#˜#K˜!Kšœ˜K˜—Kšžœ ˜K˜K˜—K–=[class: ATOM, proc: CrRPCBackdoor.CreateClientHandleProc]šœ[˜[K˜—Kšžœ˜—…—μ2