DIRECTORY BasicTime, IO, FS, Rope, IPPrinterRemoteStream, STP; IPPrinterRemoteStreamLocalStub: PROGRAM IMPORTS FS, IO, Rope, STP EXPORTS IPPrinterRemoteStream = 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 [fullFName: ROPE, bytes: INT, createDateRope: ROPE] = { BEGIN ENABLE UNWIND => {}; time: BasicTime.GMT; [fullFName: fullFName, 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, toStream: IO.STREAM] = { MyRead[fileName, name, password, toStream ! FS.Error => ERROR Error[expl: error.explanation, retryable: Retryable[TRUE, error.code, undefinedError]]]; }; MyRead: PROC [fileName: ROPE, name, password: ROPE, toStream: IO.STREAM] = { stream: IO.STREAM _ toStream; cp: FS.ComponentPositions; server, file: 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]; file _ Rope.Substr[fileName, cp.dir.start-1]; BEGIN ENABLE UNWIND => {IF stream # NIL THEN {IO.Close[stream]; stream _ NIL}}; IF Rope.IsEmpty[server] THEN {stream _ NIL; ERROR Error[expl: "Local File", retryable: FALSE]}; BEGIN stp: STP.Handle _ STP.Create[]; open: BOOL _ FALSE; Confirm: STP.ConfirmProcType = TRUSTED BEGIN -- PROC[file: Rope.ROPE] RETURNS [answer: Confirmation, localStream: IO.STREAM] RETURN[do, stream]; END; BEGIN ENABLE UNWIND => {IF open THEN stp.Close[ ! STP.Error => TRUSTED {CONTINUE}]; IF stream # NIL THEN {IO.Close[stream]; stream _ NIL}}; [] _ STP.Open[stp, server ! STP.Error => TRUSTED {ERROR Error[expl: error, retryable: FALSE]}]; open _ TRUE; STP.Login[stp, name, password]; STP.Retrieve[stp, file, Confirm ! STP.Error => TRUSTED {ERROR Error[expl: error, retryable: FALSE]}]; STP.Close[stp ! STP.Error => TRUSTED {CONTINUE}]; IO.Close[stream]; stream _ NIL END; END; END; }; END. ðIPPrinterRemoteStreamLocalStub.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Michael Plass, September 5, 1984 10:18:39 pm PDT Tim Diebert: July 2, 1986 9:13:19 am PDT Rick Beach, December 11, 1985 4:08:14 pm PST ʘcodešœ#™#Kšœ Ïmœ1™