DIRECTORY CrRPC USING [BeginErrorProc, BeginRejectProc, BeginReturnProc, ClientProcs, Handle, HandleClass, MarshallProcs, ServerProc], Endian USING [BYTE, bytesPerHWord, FWORD, HWORD], XNS USING [Address, Host, Net, Socket]; CrRPCFriends: CEDAR DEFINITIONS ~ { OPEN CrRPC; CARD: TYPE ~ LONG CARDINAL; BYTE: TYPE ~ Endian.BYTE; FWORD: TYPE ~ Endian.FWORD; HWORD: TYPE ~ Endian.HWORD; bytesPerWord: CARDINAL ~ Endian.bytesPerHWord; courierVersionNum: CARDINAL ~ 3; SessionHdr: TYPE ~ MACHINE DEPENDENT RECORD [ lowVersion: HWORD, highVersion: HWORD ]; sessionHdrBytes: CARDINAL ~ SIZE[SessionHdr]*bytesPerWord; -- should be BYTES sessionHdrHWords: CARDINAL ~ SIZE[SessionHdr]; MsgHdr: TYPE ~ MACHINE DEPENDENT RECORD [ msgType: HWORD ]; callMsgType: CARDINAL ~ 0; rejectMsgType: CARDINAL ~ 1; returnMsgType: CARDINAL ~ 2; abortMsgType: CARDINAL ~ 3; msgHdrBytes: CARDINAL ~ SIZE[MsgHdr]*bytesPerWord; -- should be BYTES msgHdrHWords: CARDINAL ~ SIZE[MsgHdr]; CallHdr: TYPE ~ MACHINE DEPENDENT RECORD [ tID: HWORD, pgmNum: FWORD, pgmVersion: HWORD, procNum: HWORD ]; callHdrBytes: CARDINAL ~ SIZE[CallHdr]*bytesPerWord; -- should be BYTES callHdrHWords: CARDINAL ~ SIZE[CallHdr]; RejectHdr: TYPE ~ MACHINE DEPENDENT RECORD [ tID: HWORD, rejectReason: HWORD -- noSuchProgram(0), noSuchVersion(1), noSuchProcedure(2), invalidArgument(3), unspecifiedReject(ffffH), ]; rejectHdrBytes: CARDINAL ~ SIZE[RejectHdr]*bytesPerWord; -- should be BYTES rejectHdrHWords: CARDINAL ~ SIZE[RejectHdr]; RejectBody: TYPE ~ MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM noSuchProgram => [], noSuchVersion => [ lowPgmVersion: HWORD, highPgmVersion: HWORD], noSuchProcedure => [], invalidArgument => [], unspecifiedReject => [] ENDCASE ]; ReturnHdr: TYPE ~ MACHINE DEPENDENT RECORD [ tID: HWORD ]; returnHdrBytes: CARDINAL ~ SIZE[ReturnHdr]*bytesPerWord; -- should be BYTES returnHdrHWords: CARDINAL ~ SIZE[ReturnHdr]; AbortHdr: TYPE ~ MACHINE DEPENDENT RECORD [ tID: HWORD, errNum: HWORD ]; abortHdrBytes: CARDINAL ~ SIZE[AbortHdr]*bytesPerWord; -- should be BYTES abortHdrHWords: CARDINAL ~ SIZE[AbortHdr]; BulkDataDescriptorType: TYPE ~ MACHINE DEPENDENT { null(0), immediate(1), passive(2), active(3) }; BulkDataXferID: TYPE ~ RECORD [ host: XNS.Host, hostRelativeXferID: ARRAY [0..2) OF CARDINAL]; BulkDataDescriptor: TYPE ~ RECORD [ SELECT type: BulkDataDescriptorType FROM null => [], immediate => [], passive, active => [ network: XNS.Net, host: XNS.Host, identifier: BulkDataXferID] ENDCASE ]; CreateClientHandleProc: TYPE ~ PROC [ remote: XNS.Address, timeoutMsec: INT ] RETURNS [Handle]; RegisterCreateClientHandleProc: PROC [ class: HandleClass, proc: CreateClientHandleProc]; NewClientObject: PROC [class: HandleClass, marshallProcs: REF MarshallProcs, procs: REF ClientProcs, data: REF ANY _ NIL, clientData: REF ANY _ NIL] RETURNS [Handle]; CreateListenerProc: TYPE ~ PROC [socket: XNS.Socket]; RegisterCreateListenerProc: PROC [ class: HandleClass, createListenerProc: CreateListenerProc]; LookUpServerProc: PROC [pgm: CARD, pgmVersion: CARDINAL] RETURNS [serverProc: ServerProc]; }. >CrRPCFriends.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Demers, September 15, 1986 4:01:28 pm PDT Introduction Friends interface for Courier runtime support, for use by class implementors. Copied Types and Constants Courier Message Types Header of a Courier session. Header of a Courier message. Header of a call message. Body of a call message is program-specific. Header of a reject message. Reject Reasons See CrRPC Body of a reject message. Header of a return message. Body of a return message is program-specific. Header of an abort message. Body of an abort message is program-specific. Bulk Data Implementing Client Stubs Proc to create a client Object handle associated with the given remote address. The interesting operations on the handle are implemented by the ClientProcs object handle.procs^. Register a CreateClientHandleProc for the given class. Allocate a new client object initialized from the arguments. Finalization is enabled, with number of package references set to 0. The finalizer just calls handle.clientProcs.finalize[handle]. This is the only approved way for a class implementor to provide Object finalization. Implementing Server Stubs Transport-specific proc to create a listener at a specified socket. Default of XNS.unknownSocket should be interpreted as a well-known socket if possible. May be called more than once with the same socket value. Look up a registered ServerProc for the given pgm/version. Return NIL if none exists. Intended to be called by (the process forked by) a Listener that has received a call message. Κœ˜šœ™Icodešœ Οmœ1™