DIRECTORY BasicTime, IO, FS, Rope, PDRemoteStream, STP; PDRemoteStreamLocalStub: PROGRAM IMPORTS FS, IO, Rope, STP EXPORTS PDRemoteStream = BEGIN Error: PUBLIC ERROR [expl: ROPE, retryable: BOOL] = CODE; ROPE: TYPE ~ Rope.ROPE; Retryable: PROC [local: BOOL, code: ATOM, stpCode: STP.ErrorCode] RETURNS [BOOL] = { IF local THEN RETURN [SELECT code FROM $connectionTimedOut, $connectionRejected => TRUE, ENDCASE => FALSE]; RETURN [SELECT stpCode FROM connectionTimedOut, connectionRejected, connectionClosed, noConnection, noNameLookupResponse => TRUE, ENDCASE => FALSE]; }; Lookup: PUBLIC PROC [fileName: ROPE, createDate: BasicTime.GMT, name, password: ROPE] RETURNS [bytes: INT, createDateRope: ROPE] = { BEGIN ENABLE UNWIND => {}; time: BasicTime.GMT; [bytes: bytes, created: time] _ FS.FileInfo[fileName ! FS.Error => Error[expl: error.explanation, retryable: FALSE]]; createDateRope _ IO.PutR[IO.time[time]]; END; }; Read: PUBLIC PROC [fileName: ROPE, name, password: ROPE, action: PROC[IO.STREAM]] = { MyRead[fileName, name, password, action ! FS.Error => ERROR Error[expl: error.explanation, retryable: Retryable[TRUE, error.code, undefinedError]]]; }; MyRead: PROC [fileName: ROPE, name, password: ROPE, action: PROC[IO.STREAM]] = { stream: IO.STREAM _ NIL; cp: FS.ComponentPositions; server: ROPE; [fileName, cp] _ FS.ExpandName[fileName ! FS.Error => ERROR Error[expl: error.explanation, retryable: Retryable[TRUE, error.code, undefinedError]]]; server _ Rope.Substr[fileName, cp.server.start, cp.server.length]; BEGIN ENABLE UNWIND => {IF stream # NIL THEN {IO.Close[stream]; stream _ NIL}}; IF Rope.IsEmpty[server] THEN BEGIN stream _ FS.StreamOpen[fileName]; action[stream]; stream.Close[]; stream _ NIL; RETURN; END; END; BEGIN stp: STP.Handle _ STP.Create[]; open: BOOL _ FALSE; BEGIN ENABLE UNWIND => {IF open THEN stp.Close[ ! STP.Error => TRUSTED {CONTINUE}]; IF stream # NIL THEN {IO.Close[stream]; stream _ NIL}}; [] _ stp.Open[server]; open _ TRUE; stp.Login[name, password]; stream _ stp.CreateRemoteStream[Rope.Substr[fileName, cp.dir.start-1], read]; action[stream]; stp.Close[ ! STP.Error => TRUSTED {CONTINUE}]; IO.Close[stream]; stream _ NIL END; END; }; END. ΖPDRemoteStreamLocalStub.mesa Copyright (C) 1984, 1985, Xerox Corporation. All rights reserved. Michael Plass, September 5, 1984 10:18:39 pm PDT Tim Diebert: October 7, 1985 11:53:36 am PDT ΚΈ˜codešœ™K™BK™0K™,K™—šΟk ˜ Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜K˜—šΠlnœ˜ Kšœœœ˜Kšœ˜šœ˜K˜—Kš œœœœ œœ˜9šœœ˜K˜—šΟn œœ œœ œ œœ˜TKšœœœœœ-œœœ˜kKš œœ œaœœœ˜”Kšœ˜K˜—šŸœœœ œœœœ œœ˜„š œœ˜Kšœœ˜Kšœ œœ4œ˜uKšœœœ ˜(Kšœ˜—Kšœ˜K˜—šŸœœœ œœ œœœ˜Ušœ)˜)Kšœ œ5œ ˜j—Kšœ˜K˜—šŸœœ œœ œœœ˜PKšœœœœ˜Kšœœœ˜(šœœ˜'Kšœœ œ5œ ˜l—K˜Bšœœœœ œœœœ˜Ošœœ˜"Kšœ œ˜!Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜—Kšœ˜—š˜Jšœœ œ ˜Jšœœœ˜š˜šœœœœœ œœ˜MJš œ œœœœ˜7—Jšœ˜Jšœœ˜ Jšœ˜JšœM˜MJšœ˜Jšœ œ œœ˜.Jšœ˜Jšœ ˜ Jšœ˜—Kšœ˜—Kšœ˜K˜—Kšœ˜——…—’