<> <> <> <> DIRECTORY <> <> <> <> <> FS, <> --???New--STP, IO, RemoteFiles, Rope, Stream, <> UserCredentials; RemoteFilesImpl: CEDAR PROGRAM IMPORTS --AlpineInterimDirectory, AlpFile, AlpTransaction, FileIOAlpine,-- IO, --New--STP, Stream, --UnsafeSTP,-- UserCredentials EXPORTS RemoteFiles = BEGIN STPStreamDataRef: TYPE = REF STPStreamData; STPStreamData: TYPE = RECORD [ handle: NewSTP.Handle, stream: Stream.Handle]; OpenSTP: PUBLIC PROC [ fileName: Rope.ROPE, accessOptions: FS.AccessOptions _ read, host, connect, directory: Rope.ROPE _ NIL ] RETURNS [ self: IO.STREAM, greetings: Rope.ROPE ] = BEGIN -- simplified for output to Oliver servers like [vice] stpHandle: NewSTP.Handle; streamHandle: Stream.Handle; SELECT accessOptions FROM write -- , read -- => NULL; ENDCASE => ERROR IO.Error[NotImplementedForThisStream, NIL]; stpHandle _ NewSTP.Create[]; IF host=NIL THEN host _ "indigo"; greetings _ stpHandle.Open[host]; stpHandle.Login[name: UserCredentials.GetUserCredentials[].name, password: UserCredentials.GetUserCredentials[].password]; IF connect#NIL THEN stpHandle.Connect[name: connect, password: NIL]; IF directory#NIL THEN stpHandle.SetDirectory[directory: directory]; streamHandle _ stpHandle.CreateRemoteStream[ file: fileName, access: (SELECT accessOptions FROM read => read, ENDCASE => write), fileType: binary]; self _ IO.CreateProcsStream[ streamProcs: IO.CreateRefStreamProcs[ putChar: SendSTPChar, unsafePutBlock: SendSTPBlock, close: CloseSTP], streamData: NEW[STPStreamData _ [ handle: stpHandle, stream: streamHandle]]]; END; SendSTPChar: PROC [ self: IO.STREAM, char: CHAR ] = BEGIN sd: STPStreamDataRef = NARROW[self.streamData]; TRUSTED {sd.stream.PutChar[char: char]}; END; SendSTPBlock: PROC [ self: IO.STREAM, block: IO.UnsafeBlock ] = BEGIN sd: STPStreamDataRef = NARROW[self.streamData]; TRUSTED {sd.stream.PutBlock[block: [blockPointer: block.base, startIndex: block.startIndex, stopIndexPlusOne: block.stopIndexPlusOne]]}; END; CloseSTP: PROC [ self: IO.STREAM, abort: BOOL _ FALSE ] = BEGIN BEGIN ENABLE UnsafeSTP.Error => IF abort THEN CONTINUE ELSE REJECT; sd: STPStreamDataRef = NARROW[self.streamData]; TRUSTED {sd.stream.Delete[]}; sd.stream _ NIL; sd.handle.Close[]; sd.handle _ NIL; END; END; <> <> <> <> <> <> <> < IF retryCount < 2 THEN LOOP;>> <> <<[instHandle: server, refUniversalFile: refUniversalFile] _>> <> <> <> <> <> <> <> <<[highWaterMark[highWaterMark: 0]]]];>> <> <> <> <> <> <> <> <> <<} ENDLOOP;>> <> <<>> <<>> <> <<>> END. -- of RemoteFilesImpl