DIRECTORY BasicTime USING [GMT], FileStream USING [StreamFromOpenFile], FS USING [FileType, Lock, OpenFile], FSBackdoor USING [CreateProcsOpenFile, CreateFileProcs, FileProcs], IO USING [STREAM], Rope USING [Concat, ROPE], YggDID USING [], YggEnvironment USING [PageCount], YggFile USING [Create, FileHandle, Open], YggFilePageMgr USING [ReadPages, VMPageSet], YggFileStream USING []; YggFileStreamImpl: CEDAR PROGRAM IMPORTS FileStream, FSBackdoor, Rope, YggFile, YggFilePageMgr EXPORTS YggDID, YggFileStream ~ BEGIN ROPE: TYPE ~ Rope.ROPE; DID: PUBLIC TYPE ~ REF DIDRep; DIDRep: PUBLIC TYPE ~ ROPE; FileProcs: REF FSBackdoor.FileProcs; FileDataRep: TYPE = RECORD [ fullFName: ROPE, -- canonical form of name openFile: YggFile.FileHandle ]; OpenFileInDirectory: PUBLIC PROC[did: DID, filePart: Rope.ROPE] RETURNS [fileHandle: YggFile.FileHandle _ NIL] = { fileHandle _ YggFile.Open[Rope.Concat[did^, filePart]]; }; CreateFileInDirectory: PUBLIC PROC[did: DID, filePart: Rope.ROPE, initialSize: YggEnvironment.PageCount] RETURNS [fileHandle: YggFile.FileHandle _ NIL] = { fileHandle _ YggFile.Create[Rope.Concat[did^, filePart], initialSize]; }; OpenStreamInDirectory: PUBLIC PROC[did: DID, filePart: Rope.ROPE] RETURNS [stream: IO.STREAM _ NIL] = { openFile: FS.OpenFile; clientFile: REF FileDataRep; fsOpenFile: FS.OpenFile; clientFile _ NEW [FileDataRep _ [fullFName: Rope.Concat[did^, filePart]]]; clientFile.openFile _ OpenFileInDirectory[did, filePart]; openFile _ FSBackdoor.CreateProcsOpenFile[clientFile: clientFile, fileProcs: FileProcs]; stream _ FileStream.StreamFromOpenFile[fsOpenFile, $write]; }; GetClass: PROC [clientFile: REF] RETURNS [ATOM] = { RETURN [$UnixFS]; }; SameFile: PROC [clientFile1, clientFile2: REF] RETURNS [BOOL] = { ERROR; }; GetName: PROC [clientFile: REF] RETURNS [fullFName, attachedTo: Rope.ROPE] = { WITH clientFile SELECT FROM fileData: REF FileDataRep => { RETURN [fileData.fullFName, fileData.fullFName]; }; ENDCASE => ERROR; }; GetInfo: PROC [clientFile: REF] RETURNS [keep: CARDINAL, pages, bytes: INT, created: BasicTime.GMT, lock: FS.Lock, fileType: FS.FileType] = { ERROR; }; SetPageCount: PROC [clientFile: REF, pages: INT] = { ERROR; }; SetByteCountAndCreatedTime: PROC [clientFile: REF, bytes: INT, created: BasicTime.GMT] = { ERROR; }; Read: UNSAFE PROC [clientFile: REF, from, nPages: INT, to: LONG POINTER] = { WITH clientFile SELECT FROM fileData: REF FileDataRep => { vMPageSet: YggFilePageMgr.VMPageSet; vMPageSet _ YggFilePageMgr.ReadPages[fileHandle: fileData.openFile, pageRun: [from, nPages]]; }; ENDCASE => ERROR; }; Write: PROC [clientFile: REF, to: INT, nPages: INT, from: LONG POINTER] = { ERROR; }; Close: PROC [clientFile: REF] = { ERROR; }; FileProcs _ FSBackdoor.CreateFileProcs[GetClass, SameFile, GetName, GetInfo, SetPageCount, SetByteCountAndCreatedTime, Read, Write, Close]; END. YggFileStreamImpl.mesa Copyright Σ 1988 by Xerox Corporation. All rights reserved. Bob Hagmann May 13, 1988 3:48:08 pm PDT For Phase 0, the DIDRep is just a string that names a directory (without the trailing /). Exported procedures FS file procs Initialization ΚM˜code•Mark outsideHeaderšœ™Kšœ<™Kšœ˜šœ˜K˜Kšœœœ˜K˜Kšœœœœ˜šœœœœ˜K™Y—K˜KšΟn œœ˜$K˜code2šœ œœ˜Lšœ œΟc˜*Lšœ˜Lšœ˜—K˜—headšœ™š Ÿœœœœœœ+˜rKšœ7˜7K˜K™—š Ÿœœœœœ ˜NJšœœ+˜LKšœF˜FK˜K™—šŸœœœœœœ œœœ˜gKšœ˜Kšœ˜Kšœ œ ˜Kšœ œ:˜JKšœ9˜9KšœX˜XKšœ;˜;K˜K™——šœ ™ š Ÿœœœœœ˜3Lšœ ˜K˜K˜—š Ÿœœœœœ˜AK˜K˜K˜—š Ÿœœœœœ˜Nšœ œ˜šœ˜Lšœ*˜0Lšœ˜—Lšœ ˜—K˜K˜—Kš Ÿœœœœœœ˜Kšœœœœ˜DK˜K˜K˜—šŸ œœœ œ˜4K˜K˜K˜—š Ÿœœœ œœ˜]K˜K˜K˜—šŸœœœœœœœ˜Lšœ œ˜šœ˜Lšœ$˜$Lšœ]˜]Lšœ˜—Lšœ ˜—K˜K˜—šŸœœœœ œœœ˜KK˜K˜K˜—šŸœœœ˜!K˜K˜——™Kšœ‹˜‹K˜—Kšœ˜—…— >