DIRECTORY BridgeComm USING [], IO USING [Close, EndOfStream, Error, GetChar, PutChar, PutRope, STREAM], RefText USING [AppendChar, ObtainScratch, ReleaseScratch], Rope USING [FromRefText, ROPE], XNSStream USING [ConnectionClosed, GetStatus, SendClose, SendEndOfMessage, SetTimeouts, State, Timeout]; BridgeCommImpl: CEDAR PROGRAM IMPORTS IO, RefText, Rope, XNSStream EXPORTS BridgeComm ~ { ROPE: TYPE ~ Rope.ROPE; NetworkStream: TYPE ~ IO.STREAM; Error: PUBLIC ERROR [msg: ROPE] ~ CODE; GetRopeToEOM: PROC [s: NetworkStream] RETURNS [rope: ROPE] ~ { buf: REF TEXT; state: XNSStream.State; buf _ RefText.ObtainScratch[200]; DO c: CHAR _ IO.GetChar[s ! IO.EndOfStream => EXIT]; buf _ RefText.AppendChar[to: buf, from: c]; ENDLOOP; DO [state~state] _ XNSStream.GetStatus[s, TRUE]; IF state = open THEN EXIT; ENDLOOP; rope _ Rope.FromRefText[buf]; RefText.ReleaseScratch[buf]; }; GetMsg: PUBLIC PROC [s: NetworkStream] RETURNS [msg: CHAR, arg: ROPE] ~ { ENABLE XNSStream.ConnectionClosed, XNSStream.Timeout, IO.Error, IO.EndOfStream => ERROR Error["Communication Failure"]; msg _ IO.GetChar[s]; arg _ GetRopeToEOM[s]; }; PutMsg: PUBLIC PROC [s: NetworkStream, msg: CHAR, arg: ROPE _ NIL] ~ { ENABLE XNSStream.ConnectionClosed, XNSStream.Timeout, IO.Error => ERROR Error["Communication Failure"]; IO.PutChar[s, msg]; IO.PutRope[s, arg]; XNSStream.SendEndOfMessage[s]; }; PutMsgWithReply: PUBLIC PROC [s: NetworkStream, msg: CHAR, arg: ROPE _ NIL] RETURNS [ansMsg: CHAR, ansArg: ROPE] ~ { PutMsg[s, msg, arg]; [ansMsg, ansArg] _ GetMsg[s]; }; PutMsgWithAck: PUBLIC PROC [s: NetworkStream, msg: CHAR, arg: ROPE _ NIL] ~ { ansMsg: CHAR; ansArg: ROPE; PutMsg[s, msg, arg]; [ansMsg, ansArg] _ GetMsg[s]; IF ansMsg # 'Y THEN ERROR Error[ IF ansMsg = 'N THEN ansArg ELSE NIL ]; }; CloseConnection: PUBLIC PROC [s: NetworkStream] ~ { IF s # NIL THEN { { ENABLE XNSStream.ConnectionClosed => CONTINUE; XNSStream.SetTimeouts[s, 10000, 10000]; [] _ XNSStream.SendClose[s] }; IO.Close[s] }; }; }... ”BridgeCommImpl.mesa Demers, February 20, 1987 10:59:48 am PST Read to EOM and return chars read as a rope. Clear the EndOfStream condition. Κ˜code™K™)K˜—šΟk ˜ Kšœ œ˜Kšœœ8œ˜HKšœœ-˜:Kšœœœ˜Kšœ œY˜hK˜—šΟnœœ˜Kš œœœ ˜$Kšœ ˜Kšœ˜K˜Kšœœœ˜Kšœœœœ˜ K˜Kšžœ œœœ˜'K˜šž œœœœ˜>K™NKšœœœ˜K˜K˜!š˜Kš œœœ œœ˜1K˜+Kšœ˜—š˜Kšœ'œ˜-Kšœœœ˜Kšœ˜—K˜K˜K˜—K˜š žœ œœœœ˜IKšœ0œœœ ˜wKšœœ ˜Kšœ˜K˜K™—š žœœœœœœ˜FKšœ0œ œ ˜gKšœ˜Kšœ˜Kšœ˜K˜K˜—šžœœœœœœœ œ œ˜tKšœ˜Kšœ˜K˜K˜—š ž œœœœœœ˜MKšœœ˜ Kšœœ˜ Kšœ˜Kšœ˜Kšœ œœœ œœœ˜GK˜K˜—šžœœœ˜3šœœœ˜šœœœ˜0Kšœ'˜'Kšœ˜—Kšœ ˜—K˜—K˜K˜—J˜—…—Κ l