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: ROPE ฌ NIL] 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: BOOL ฌ FALSE] ~ { c.state.onLine ฌ TRUE; c.state.connectivity ฌ connected; c.client.type.NoteState[c]; RETURN}; StartDisconnect: PROC [c: Conversant, verbosely: BOOL ฌ TRUE] = { 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: BOOL ฌ TRUE] ~ {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]; }. า EchoProtocol.Mesa Copyright ำ 1992 by Xerox Corporation. All rights reserved. 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 สย•NewlineDelimiter –(cedarcode) style™code™Kšœ ฯeœ1™