The Protocol interface defines header formats of messages
   that encode remote method invocations and stream marshaling.
   Clients who wish to write optimized stubs that operate directly
   on transport connections should use the types in this interface
   to produce the appropriate wire representation. 
   
INTERFACEThis header appears in all messages. TheProtocol ; IMPORT StubLib, WireRep; TYPE Header = StubLib.DataRep; Op = { MethodCall, Return, CallFailed, w1, w2, ResultAck, StreamData, StreamClose, StreamRelease, StreamOK, StreamError };
intFmt, floatFmt, and
   charSet fields of a Header indicate the native data representation
   of the sender.   For a header hdr, VAL(hdr.private, Op) indicates
   the message type as follows:
   MethodCall indicates a method invocation.  A header of type CallHeader
      (below) is expected.  It is followed by the arguments of the call.
      A reponse of type Return or CallFailed is expected.
   Return indicates a successful return from a method invocation.  The
      header is followed by marshaled results.  If the result contains
      a marshaled subtype of NetObj.T, a reponse of type ResultAck
      is expected. 
   CallFailed indicates that a remote method invocation failed,
      and that the message contains an AtomList.T which specifies the
      failure reason. 
   ResultAck indicates an acknowledgement for result marshaling where
      the results included a stubtype of NetObj.T.  This message
      type has null content.
   StreamData indicates that the message contains the characters
      for the source of a remote Rd.T or for the target of a
      remote Wr.T.  In the former case, the following message
      will be of type StreamOK or StreamError and this will
      indicate success or failure upon reading the concrete reader.
      In the latter case, target Wr.T should be flushed after the
      entire message is received and written to the target, and a
      StreamOK or StreamError response is expected.
   StreamClose indicates that the associated concrete Rd.T or
      Wr.T should be closed.  This message type has null content.
      A response message of StreamOK or StreamError is expected.
   StreamRelease indicates that the resources associated with
      a surrogate Rd.T or Wr.T should be released without closing
      the concrete stream.  This message type has null content.
      A response message of StreamOK or StreamError is expected.
   StreamOK indicates that no error occured while reading,
      writing, flushing, closing, or releasing the concrete target
      of a surrogate Rd.T or Wr.T.   If the target is a writer,
      this message type is sent in response to a StreamData message.
      If the target is a reader, then this message type follows the
      successful marshaling of reader data.  In either case, a StreamOK
      message can be sent in response to a StreamClose or StreamRelease
      message.  The message itself has no content.
   StreamError indicates that an error occured while reading,
      writing, flushing, closing, or releasing  the concrete target of
      a surrogate Rd.T or Wr.T.  The message contains an AtomList.T
      describing the failure.
   w1 and w2 are placeholders for protocol backward compatibility.
CallHeader = RECORD
    hdr: Header;
    prot: StubLib.StubProtocol;
    obj: WireRep.T;
  END;
 A CallHeader prefixes every message initiating a remote method call.
   It contains a Header, the stub protocol employed by the invoker's stub
   (in native byte order), and the object ID of the target object. 
MsgHeader = RECORD
    hdr: Header;
    pad: StubLib.Int32;
  END;
 A MsgHeader prefixes every message other than a remote method call.
   It is padded to 64-bit alignment so that data streams will be aligned
   correctly in memory on 64-bit machines.
END Protocol.