DIRECTORY BasicTime USING [GMT, nullGMT], File USING [Error, FP, GetProperties, Handle, PageCount, PropertyStorage, RC, WriteProperties], FSBackdoor USING [ProduceError, Version], FSFileOps, FSReport USING [FileError], GVBasics USING [MakeKey, Password], PrincOpsUtils USING [LongCopy], Rope USING [Length, NewText, ROPE, Text]; FSPropertiesImpl: CEDAR MONITOR IMPORTS File, FSBackdoor, FSReport, GVBasics, PrincOpsUtils, Rope EXPORTS FSFileOps = { PropertiesObject: TYPE = RECORD [ validation: GVBasics.Password, bytes: INT, keep: CARDINAL, created: BasicTime.GMT, version: FSBackdoor.Version, nameBody: TextRep]; TextRep: TYPE = RECORD[PACKED SEQUENCE length: CARDINAL OF CHAR]; Properties: TYPE = LONG POINTER TO PropertiesObject; GetProps: PUBLIC PROC [f: File.Handle] RETURNS [bytes: INT, keep: CARDINAL, created: BasicTime.GMT] = { InnerGet: ENTRY PROC = TRUSTED { ENABLE UNWIND => NULL; pPtr: Properties = LOOPHOLE[File.GetProperties[f].prop, Properties]; IF pPtr.validation = validation THEN { bytes _ pPtr.bytes; keep _ pPtr.keep; created _ pPtr.created; } ELSE invalidPP _ TRUE; -- invalid property page }; fileRC: File.RC _ ok; invalidPP: BOOLEAN _ FALSE; InnerGet[ ! File.Error => {fileRC _ why; CONTINUE} ]; IF invalidPP THEN InvalidPropertyPage[]; IF fileRC # ok THEN FSReport.FileError[fileRC]; }; GetNameBodyAndVersion: PUBLIC PROC [f: File.Handle] RETURNS [nameBody: Rope.Text, version: FSBackdoor.Version] = { InnerGetNameBodyAndVersion: ENTRY PROC = TRUSTED { ENABLE UNWIND => NULL; pPtr: Properties = LOOPHOLE[File.GetProperties[f].prop, Properties]; IF pPtr.validation = validation THEN { nameBody _ GetText[@pPtr.nameBody]; version _ pPtr.version; } ELSE invalidPP _ TRUE; -- invalid property page }; fileRC: File.RC _ ok; invalidPP: BOOLEAN _ FALSE; InnerGetNameBodyAndVersion[ ! File.Error => {fileRC _ why; CONTINUE} ]; IF invalidPP THEN InvalidPropertyPage[]; IF fileRC # ok THEN FSReport.FileError[fileRC]; }; InitializePropertyStorage: PUBLIC PROC [fp: File.FP, propStorage: File.PropertyStorage, nPages: File.PageCount] = TRUSTED { LOOPHOLE[propStorage, Properties].validation _ validation }; SetProps: PUBLIC PROC [f: File.Handle, bytes: INT, keep: CARDINAL, created: BasicTime.GMT, nameBody: Rope.Text, version: FSBackdoor.Version] = { InnerSet: ENTRY PROC = TRUSTED { ENABLE UNWIND => NULL; pPtr: Properties = LOOPHOLE[File.GetProperties[f].prop, Properties]; IF pPtr.validation = validation THEN { IF bytes # -1 THEN pPtr.bytes _ bytes; pPtr.keep _ keep; IF created # BasicTime.nullGMT THEN pPtr.created _ created; pPtr.version _ version; PutText[nameBody, @(pPtr.nameBody)]; File.WriteProperties[f]; } ELSE invalidPP _ TRUE; -- invalid property page here is a bug }; fileRC: File.RC _ ok; invalidPP: BOOLEAN _ FALSE; InnerSet[ ! File.Error => {fileRC _ why; CONTINUE} ]; IF invalidPP THEN ERROR; IF fileRC # ok THEN FSReport.FileError[fileRC]; }; SetBytesAndCreated: PUBLIC PROC [f: File.Handle, bytes: INT, created: BasicTime.GMT] = { InnerSetBytesAndCreated: ENTRY PROC = TRUSTED { ENABLE UNWIND => NULL; pPtr: Properties = LOOPHOLE[File.GetProperties[f].prop, Properties]; IF pPtr.validation = validation THEN { IF bytes # -1 THEN pPtr.bytes _ bytes; IF created # BasicTime.nullGMT THEN pPtr.created _ created; File.WriteProperties[f]; } ELSE invalidPP _ TRUE; -- invalid property page }; fileRC: File.RC _ ok; invalidPP: BOOLEAN _ FALSE; InnerSetBytesAndCreated[ ! File.Error => {fileRC _ why; CONTINUE} ]; IF invalidPP THEN InvalidPropertyPage[]; IF fileRC # ok THEN FSReport.FileError[fileRC]; }; SetKeep: PUBLIC PROC [f: File.Handle, keep: CARDINAL] = { InnerSetKeep: ENTRY PROC = TRUSTED { ENABLE UNWIND => NULL; pPtr: Properties = LOOPHOLE[File.GetProperties[f].prop, Properties]; IF pPtr.validation = validation THEN { pPtr.keep _ keep; File.WriteProperties[f]; } ELSE invalidPP _ TRUE; -- invalid property page }; fileRC: File.RC _ ok; invalidPP: BOOLEAN _ FALSE; InnerSetKeep[ ! File.Error => {fileRC _ why; CONTINUE} ]; IF invalidPP THEN InvalidPropertyPage[]; IF fileRC # ok THEN FSReport.FileError[fileRC]; }; InvalidPropertyPage: PROC = { FSBackdoor.ProduceError[invalidPropertyPage, "Property page of a local file has a bad property page"]; }; GetText: PROC [tR: LONG POINTER TO TextRep] RETURNS [t: Rope.Text] = TRUSTED { chars: NAT _ tR.length; IF chars = 0 THEN t _ NIL ELSE { t _ Rope.NewText[chars]; PrincOpsUtils.LongCopy[ from: tR + SIZE[TextRep[0]], nwords: SIZE[TEXT[chars]] - SIZE[TEXT[0]], to: LOOPHOLE[t, LONG POINTER] + SIZE[TEXT[0]] ]; }; }; PutText: PROC [t: Rope.Text, tR: LONG POINTER TO TextRep] = TRUSTED { chars: NAT _ Rope.Length[t]; bogus: LONG POINTER TO NAT _ LOOPHOLE[tR]; bogus^ _ chars; IF chars # 0 THEN PrincOpsUtils.LongCopy[ to: tR + SIZE[TextRep[0]], nwords: SIZE[TEXT[chars]] - SIZE[TEXT[0]], from: LOOPHOLE[t, LONG POINTER] + SIZE[TEXT[0]] ]; }; validation: GVBasics.Password _ ALL[0]; ComputeValidation: PROC = { stamp: Rope.ROPE = "August 19, 1983 1:16 pm"; -- DON'T CHANGE THIS!!! -- validation _ GVBasics.MakeKey[stamp]; }; ComputeValidation[]; }. 0FSPropertiesImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Schroeder, November 15, 1983 1:36 pm Levin, September 22, 1983 1:04 pm Bob Hagmann February 4, 1985 10:35:57 am PST Russ Atkinson (RRA) May 13, 1985 9:08:19 pm PDT Exported to FSFileOps Internal procedures We would rather do "tR.length _ chars", but the compiler won't allow it. Validation stuff for leader pages; changing the stamp will require all nucleus volumes to be erased. Start code. Bob Hagmann February 4, 1985 9:45:28 am PST changes for exending property storage in File, added Copyright changes to: DIRECTORY, GetProps, GetNameBodyAndVersion, InitializePropertyStorage, SetProps, SetBytesAndCreated, SetKeep, GetProps, GetNameBodyAndVersion, InitializePropertyStorage, SetProps, SetBytesAndCreated, SetKeep Κό– "Cedar" style˜code™Kšœ Οmœ2™=K™$K™!K™,K™/K™—šΟk ˜ Kšœ žœžœ ˜Kšœžœ žœ5žœ˜_Kšœ žœ˜)Kšœ ˜ Kšœ žœ ˜Kšœ žœ˜#Kšœžœ ˜Kšœžœžœ˜)K˜—šœžœž˜Kšžœ:˜AKšžœ ˜Kšœ˜K˜šœžœžœ˜!Kšœ˜Kšœžœ˜ Kšœžœ˜Kšœžœ˜Kšœ˜Kšœ˜—šœ žœžœžœžœ žœžœžœ˜AK˜—Kš œ žœžœžœžœ˜4K˜—™K˜šΟnœžœžœžœ žœžœžœ˜gšŸœžœžœžœ˜ Kšžœžœžœ˜Kšœžœ)˜Dšžœ˜šžœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜—Kšžœ žœΟc˜/—Kšœ˜—Kšœ žœ˜Kšœ žœžœ˜Kšœ)žœ˜5Kšžœ žœ˜(Kšžœ žœ˜/Kšœ˜K˜—šŸœžœžœžœ7˜ršŸœžœžœžœ˜2Kšžœžœžœ˜Kšœžœ)˜Dšžœ˜šžœ˜Kšœ#˜#Kšœ˜Kšœ˜—Kšžœ žœ ˜/—Kšœ˜—Kšœ žœ˜Kšœ žœžœ˜šœ˜Kšœžœ˜+—Kšžœ žœ˜(Kšžœ žœ˜/Kšœ˜K˜—š Ÿœžœžœ žœ?žœ˜{Kšžœ1˜9Kšœ˜K˜—š Ÿœžœžœžœžœžœ7˜šŸœžœžœžœ˜!Kšžœžœžœ˜Kšœžœ)˜Dšžœ˜šžœ˜Kšžœ žœ˜&Kšœ˜Kšžœžœ˜;Kšœ˜Kšœ$˜$K˜Kšœ˜—Kšžœ žœ &˜=—Kšœ˜—Kšœ žœ˜Kšœ žœžœ˜Kšœ)žœ˜5Kšžœ žœžœ˜Kšžœ žœ˜/Kšœ˜K˜—š Ÿœžœžœžœžœ˜XšŸœžœžœžœ˜/Kšžœžœžœ˜Kšœžœ)˜Dšžœ˜šžœ˜Kšžœ žœ˜&Kšžœžœ˜;Kšœ˜Kšœ˜—Kšžœ žœ ˜/—Kšœ˜—Kšœ žœ˜Kšœ žœžœ˜Kšœ8žœ˜DKšžœ žœ˜(Kšžœ žœ˜/Kšœ˜K˜—šŸœžœžœžœ˜9šŸ œžœžœžœ˜$Kšžœžœžœ˜Kšœžœ)˜Dšžœ˜šžœ˜Kšœ˜Kšœ˜Kšœ˜—Kšžœ žœ ˜/—Kšœ˜—Kšœ žœ˜Kšœ žœžœ˜Kšœ-žœ˜9Kšžœ žœ˜(Kšžœ žœ˜/Kšœ˜K˜——™K˜šœžœ˜Kšœf˜fKšœ˜K˜—šŸœžœžœžœžœ žœžœ˜NKšœžœ ˜šžœ ˜ Kšžœž˜ šžœ˜Kšœ˜˜Kšœ žœ ˜Kš œžœžœ žœžœ˜*Kš œžœžœžœžœžœ˜-K˜—Kšœ˜——Kšœ˜K˜—š Ÿœžœžœžœžœ žœ˜EKšœžœ˜Kš œžœžœžœžœžœ˜*šœ˜KšœH™H—šžœ ž˜˜Kšœ žœ ˜Kš œžœžœ žœžœ˜*Kš œžœžœžœžœžœ˜/K˜——Kšœ˜K˜—Kšœ žœ˜'šŸœžœ˜K™eKšœ žœ ˜HKšœ%˜%Kšœ˜K˜——™ Kšœ˜—Kšœ˜K™™+Kšœ>™>Kšœ ΟrΟ™Ϋ—K™K™—…—Δπ