<<>> <> <> <> <> <> <> <> <> DIRECTORY AdobeIO USING [LocalAndDomain], AdobeOps USING [ARSystemHandle], ARAccess USING [ARStorage, DataTable, ErrorCode], <> Convert USING [RopeFromCard], <> <> IO USING [Close, EndOfStream, Error, GetChar, STREAM], <> <> <> <> <> <> <> <> <> <> <> <> <> PFS USING [AbsoluteName, Close, Error, ErrorDesc, Open, OpenFile, PATH, PathFromRope, StreamFromOpenFile], <> RefText USING [AppendChar, ObtainScratch, ReleaseScratch], Rope USING [Cat, Concat, FromRefText, Length, ROPE, Text]; <> <> <> <> ARAccessImpl: CEDAR MONITOR --LOCKS session USING session: Session IMPORTS AdobeIO, Convert, IO, RefText, Rope, PFS --Auth, Courier, MSegment, NSDataStream, NSFile, NSName, NSString, --Process, Stream, String EXPORTS ARAccess = BEGIN OPEN ARAccess; <<-- -- -- -- -- -- -->> <> <<-- -- -- -- -- -- -->> Session: TYPE = AdobeOps.ARSystemHandle; <> <> <> <> <> <> <> <> <> <> <> <> ARHandle: TYPE = REF ARObject; ARObject: PUBLIC TYPE = RECORD [ password: CARDINAL ¬ ARPassword, <> fH: PFS.OpenFile ¬ NIL, --NSFile.Handle ¬ NSFile.nullHandle, sH: IO.STREAM ¬ NIL, name: Rope.ROPE ¬ NIL, --NSFile.String ¬ NSFile.nullString, number: CARDINAL ¬ LAST[CARDINAL], checkedOut: BOOLEAN ¬ FALSE]; CommandType: TYPE = {get, examine, checkout, checkin, submit, null}; SessionPassword: CARDINAL = 567B; ARPassword: CARDINAL = 234B; maxFileName: CARDINAL = 100; maxDigits: CARDINAL = 5; -- constant length of an AR filename secondsToWaitForCheckedOutAR: CARD --Process.Seconds-- = 0; <<-- -- -- -- -- -- -->> <> <<-- -- -- -- -- -- -->> Error: PUBLIC ERROR [session: Session, why: ErrorCode] = CODE; <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> <> GetAR: PUBLIC PROCEDURE [session: Session, arNumber: CARDINAL] RETURNS [arH: ARHandle] = <> BEGIN getAR: PROC = { arH ¬ NEW[ARObject ¬ [ fH: OpenFileHandleOnAR[session, arNumber], number: arNumber]]; }; CatchErrors[session, getAR, get]; RETURN[arH] END; OpenFileHandleOnAR: PROCEDURE [ session: Session, arNumber: CARDINAL] RETURNS [fH: PFS.OpenFile --NSFile.Handle--] = { arFileName: Rope.ROPE ¬ NIL; --[maxFileName]; dH: PFS.PATH ¬ OpenSubDirectory[session, arNumber]; fH ¬ PFS.Open[ name: PFS.AbsoluteName[ARNumberToFileName[arNumber], dH]]; <> <> <> <> <> <> <<** with current impl of OpenSubDirectory, for now don't close;>> -- CloseFile[@dH, session] -- }; FreeAR: PUBLIC PROCEDURE [session: Session, arH: ARHandle] RETURNS [nil: ARHandle] = { <> <> IF arH.checkedOut THEN ERROR Error[session, youMustFirstCheckIn]; CloseFile[arH--@arH.fH--, session]; <> RETURN[NIL]; }; ExamineAR: PUBLIC PROCEDURE [session: Session, arH: ARHandle] RETURNS [to: ARAccess.ARStorage] = { Sink: PROC [source: ARHandle] = { ENABLE UNWIND => IO.Close[source.sH]; to ¬ CopyAR[session: session, from: source ! UNWIND => IO.Close[source.sH]]; }; examineAR: PROC = { Sink[arH]; CloseFile[arH, session]; }; CatchErrors[session, examineAR, examine] }; <> <> <> <> <> <> < CONTINUE;>> < Stream.Delete[source]};>> <<[] _ CopyAR[>> <> <>> <> < CONTINUE]];>> <<>> <> < CONTINUE]>> <> <> <> <> <<};>> <> <> <> <> <> <> <> <> <> < CONTINUE;>> < Stream.Delete[source]};>> <<[] _ CopyAR[>> <> <>> <> < CONTINUE]];>> <> < CONTINUE]>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <> <> <> <<};>> <> <> <> <> <> <> <> < Stream.Delete[sink];>> < CONTINUE};>> <<[] _ CopyAR[>> <> < NSDataStream.Abort[sink! NSDataStream.Aborted => CONTINUE]]>> <> < CONTINUE]>> <> <> <> <<[name[arH.name]], [type[NSAssignedTypes.tText]]];>> <> <<[fileID[arH.parentID]]];>> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> < Stream.Delete[sink];>> < CONTINUE};>> <<[] _ CopyAR[>> <> < NSDataStream.Abort[sink ! NSDataStream.Aborted => CONTINUE]]>> <> < CONTINUE]>> <> <> <> <> <> <<[name[ARNumberToFileName[arNumber, fileName]]], [>> <> <> <> <> <> <<** with current impl of OpenSubDirectory, for now don't close;>> <> <> <> <> <<-- -- -- -- -- -- -->> <> <<-- -- -- -- -- -- -->> CatchErrors: PROCEDURE [session: Session, proc: PROC, type: CommandType] = BEGIN ENABLE { <> PFS.Error => PFSError[session, error]; IO.Error => ERROR Error[session, communicationError] }; proc[]; <> <>> <> <> < KillProbingProcess[session];>> <> <> <> <> <> <>> <> <>> <> < ERROR Error[session, currentlyCheckedOut];>> < ERROR Error[session, arNotFound];>> < ERROR Error[session, communicationError];>> <>> <