Copyright (C) 1994, Digital Equipment Corp.
Protocol.m3
MODULE Protocol;
IMPORT NetObj, StubLib, Rd, Wr, Thread;
PROCEDURE RecvOp(c: StubLib.Conn; state: State; VAR rep: StubLib.DataRep) : Op
RAISES {NetObj.Error, Rd.Failure, Thread.Alerted} =
VAR i: CARDINAL;
op: Op;
BEGIN
IF state # State.CallWait THEN
IF NOT c.rd.nextMsg() THEN
StubLib.RaiseUnmarshalFailure();
END;
END;
StubLib.InBytes(c, rep.byte);
i := StubLib.InInt32(c, rep, 0, ORD(LAST(Op)));
op := VAL(i, Op);
CASE state OF
| State.CallWait =>
IF op # Op.MethodCall THEN StubLib.RaiseUnmarshalFailure(); END;
| State.ReturnWait =>
IF op # Op.Return AND op # Op.CallFailed THEN
StubLib.RaiseUnmarshalFailure();
END;
| State.AckWait =>
IF op # Op.ResultAck THEN StubLib.RaiseUnmarshalFailure(); END;
| State.StreamWait =>
IF op # Op.StreamData THEN StubLib.RaiseUnmarshalFailure(); END;
| State.StreamResWait =>
IF op # Op.StreamRes THEN StubLib.RaiseUnmarshalFailure(); END;
END;
RETURN op;
END RecvOp;
PROCEDURE SendOp(c: StubLib.Conn; op: Op)
RAISES {Wr.Failure, Thread.Alerted} =
BEGIN
StubLib.OutBytes(c, StubLib.NativeRep.byte);
StubLib.OutInt32(c, ORD(op));
END SendOp;
BEGIN
END Protocol.