EchoProtocol.Mesa
Last Edited by: Spreitzer, March 20, 1985 11:42:33 am PST
Last tweaked by Mike Spreitzer on November 6, 1989 6:31:18 pm PST
DIRECTORY IO, Process, Protocols, RefText, Rope;
EchoProtocol: CEDAR PROGRAM
IMPORTS IO, Process, Protocols, RefText
= {OPEN Protocols;
echo: Protocol ← NEW [ProtocolRep ← [
name: "Echo",
Instantiate: Instantiate,
StartConnect: StartConnect,
StartDisconnect: StartDisconnect,
GiveUp: GiveUp,
SetOnLine: SetOnLine,
protocolData: NIL]];
Instantiate: PROC [client: Client, logFileName: ROPENIL] RETURNS [c: Conversant] ~ {
c ← NEW [ConversantPrivate ← [echo, client, [FALSE, disconnected], NIL, client.fromClient, NIL]];
TRUSTED {Process.Detach[FORK Copy[from: client.fromClient, to: client.toClient]]};
RETURN};
StartConnect: PROC [c: Conversant, serverName: ROPE, login: BOOLFALSE] ~ {
c.state.onLine ← TRUE;
c.state.connectivity ← connected;
c.client.type.NoteState[c];
RETURN};
StartDisconnect: PROC [c: Conversant, verbosely: BOOLTRUE] = {
c.state.onLine ← FALSE;
c.state.connectivity ← disconnected;
c.client.type.NoteState[c];
RETURN};
SetOnLine: PROC [c: Conversant, onLine: BOOL] ~ {
c.state.onLine ← onLine;
c.client.type.NoteState[c];
RETURN};
GiveUp: PROC [c: Conversant, verbosely: BOOLTRUE] ~ {RETURN};
Copy: PROC [from, to: IO.STREAM] ~ {
bufsize: NAT ~ bufferSize;
buff: REF TEXT ~ RefText.New[bufsize];
{ENABLE IO.Error, IO.EndOfStream => CONTINUE;
WHILE NOT from.EndOf[] DO
ask: NAT ~ MIN[from.CharsAvail[TRUE], bufsize];
got: NAT ← from.GetBlock[buff, 0, ask !IO.EndOfStream => EXIT];
IF got=0 THEN ERROR--yet another bloody fool hasn't implemented an IO class correctly--;
to.PutBlock[buff];
ENDLOOP;
};
from.Close[!IO.Error => CONTINUE];
to.Close[!IO.Error => CONTINUE];
RETURN};
bufferSize: NAT ← 1024;
Protocols.RegProtocol[echo];
}.