-- File: AlpineConvertImpl.mesa -- Last edited by: -- Kolling on February 9, 1984 2:49:52 pm PST DIRECTORY AlpFile USING[Handle, Open, ReadProperties], AlpineEnvironment USING[AccessList, FileStore, LockOption, nullVolumeGroupID, OwnerProperty, OwnerPropertyValuePair, Outcome, PageCount, PropertyValuePair, UniversalFile], AlpineInterimDirectory USING[EnumerateDirectoryUnderTrans], AlpInstance USING[Create, Handle], AlpTransaction USING[AssertAlpineWheel, Create, Finish, GetNextVolumeGroup, Handle, ReadNextOwner], Convert USING[RopeFromInt], FS USING[StreamOpen], IO USING[Close, PutFR, PutRope, STREAM, text], RuntimeError USING[BoundsFault], Rope USING[Cat, Equal, Find, ROPE, Substr]; AlpineConvertImpl: CEDAR PROGRAM IMPORTS AlpF: AlpFile, AlpineInterimDirectory, AlpI: AlpInstance, AlpT: AlpTransaction, Convert, FS, IO, Rope, RuntimeError = BEGIN OPEN AE: AlpineEnvironment; Main: PUBLIC PROC = BEGIN createOwnersFile: IO.STREAM _ FS.StreamOpen["CreateOwners.cm", $create]; saveAndRestoreFile: IO.STREAM _ FS.StreamOpen["SaveAndRestoreFiles.cm", $create]; setFilePropsFile: IO.STREAM _ FS.StreamOpen["SetFileProps.cm", $create]; alpOwner: Rope.ROPE _ NIL; transHandle: AlpT.Handle _ AlpT.Create[instHandle: AlpI.Create[fileStore: "luther.alpine"], createLocalWorker: TRUE]; transHandle.AssertAlpineWheel[TRUE]; DO ownerProperties: LIST OF AE.OwnerPropertyValuePair; ownerCreateAccessList: AE.AccessList; ownerModifyAccessList: AE.AccessList; ownerQuota: INT; directory: Rope.ROPE; [alpOwner, ownerProperties] _ transHandle.ReadNextOwner[ volumeGroupID: transHandle.GetNextVolumeGroup[previousGroup: AE.nullVolumeGroupID, lock: [none, wait]], previousOwner: alpOwner, desiredProperties: ALL [TRUE]]; IF alpOwner = NIL THEN EXIT; IF Rope.Equal[alpOwner, "SpecialOwnerForAlpineAdmin", FALSE] THEN LOOP; directory _ Rope.Cat["[luther.alpine]", "<", alpOwner, ">"]; ownerCreateAccessList _ NIL; ownerModifyAccessList _ NIL; ownerQuota _ 0; UNTIL ownerProperties = NIL DO TRUSTED BEGIN WITH ownerProperties.first SELECT FROM createAccessList => ownerCreateAccessList _ createAccessList; modifyAccessList => ownerModifyAccessList _ modifyAccessList; quota => ownerQuota _ quota; ENDCASE; END; ownerProperties _ ownerProperties.rest; ENDLOOP; createOwnersFile.PutRope[Rope.Cat["_ AlpineCmds.CreateOwner[""", directory, """, ", Convert.RopeFromInt[from: ownerQuota, base: 10, showRadix: FALSE], "]; "]]; createOwnersFile.PutRope[Rope.Cat["_ AlpineCmds.SetOwnerCreateAccess[""", directory, """, ", GenRopeFromListOfRopes[ownerCreateAccessList], "]; "]]; createOwnersFile.PutRope[Rope.Cat["_ AlpineCmds.SetOwnerModifyAccess[""", directory, """, ", GenRopeFromListOfRopes[ownerModifyAccessList], "]; "]]; BEGIN EnumProc: PROC [fileName: REF TEXT, universalFile: AE.UniversalFile] RETURNS [quit: BOOL] = BEGIN file: Rope.ROPE _ IO.PutFR["%g", IO.text[fileName]]; fileProperties: LIST OF AE.PropertyValuePair; fileModifyAccessList: AE.AccessList _ NIL; fileReadAccessList: AE.AccessList _ NIL; segment: BOOLEAN _ FALSE; dotPlace: INT _ file.Find[".", , TRUE]; IF dotPlace # -1 THEN BEGIN ENABLE RuntimeError.BoundsFault => GOTO notSegment; oldDotPlace: INT _ dotPlace; UNTIL (dotPlace _ file.Find[".", oldDotPlace + 1, TRUE]) = -1 DO oldDotPlace _ dotPlace; ENDLOOP; segment _ Rope.Equal["segment", Rope.Substr[file, oldDotPlace + 1, ], FALSE]; EXITS notSegment => NULL; END; saveAndRestoreFile.PutRope[Rope.Cat[(IF segment THEN "=" ELSE ""), directory, file, " "]]; fileProperties _ AlpF.Open[transHandle, universalFile, readOnly, [read, wait]].handle.ReadProperties[]; UNTIL fileProperties = NIL DO TRUSTED BEGIN WITH fileProperties.first SELECT FROM modifyAccess => fileModifyAccessList _ modifyAccess; readAccess => fileReadAccessList _ readAccess; ENDCASE; END; fileProperties _ fileProperties.rest; ENDLOOP; setFilePropsFile.PutRope[Rope.Cat[" copy mumble _ [Ivy]luther>", alpOwner, ">", file, " " ]]; setFilePropsFile.PutRope[Rope.Cat["_ AlpineCmds.WheelCopy[from: ""mumble"", to: """, directory, file, """, enableWheel: TRUE]; " ]]; setFilePropsFile.PutRope["delete mumble "]; setFilePropsFile.PutRope[Rope.Cat["_ AlpineCmds.SetReadAccess[""", directory, file, """, ", GenRopeFromListOfRopes[fileReadAccessList], "]; " ]]; setFilePropsFile.PutRope[Rope.Cat["_ AlpineCmds.SetModifyAccess[""", directory, file, """, ", GenRopeFromListOfRopes[fileModifyAccessList], "]; " ]]; RETURN[quit: FALSE]; END; AlpineInterimDirectory.EnumerateDirectoryUnderTrans[transHandle, directory, EnumProc]; END; ENDLOOP; [] _ transHandle.Finish[requestedOutcome: commit, continue: FALSE]; createOwnersFile.Close[]; saveAndRestoreFile.Close[]; setFilePropsFile.Close[]; END; GenRopeFromListOfRopes: PROCEDURE[accessList: AE.AccessList] RETURNS[rope: Rope.ROPE] = BEGIN first: BOOLEAN _ TRUE; rope _ "LIST["; UNTIL accessList = NIL DO IF first THEN first _ FALSE ELSE rope _ Rope.Cat[rope, ", "]; rope _ Rope.Cat[rope, """", accessList.first, """"]; accessList _ accessList.rest; ENDLOOP; rope _ Rope.Cat[rope, "]"]; END; END. Ê}˜Jš¨ÏccœÏk œžœ=žœËžœ7žœ,žœcžœžœžœžœžœžœ!žœžœ žœžœ Ðblœžœžœžœ_žœžœžœžœžœ#ÏnœžœžœžœžœžœžœBžœžœžœGžœžœžœ=žœžœ}žœ&žœžœžœžœžœ5žœ)žœžœžœžœ^žœžœ žœ žœžœžœžœ4žœžœžœažœžœžœžœžœž!œžœžœÀž œžœ?ž œ žœÞžœ œžœ žœžœžœžœžœ žœžœžœ žœ*žœžœEžœ.žœžœžœžœžœ žœž œžœžœ žœžœžœžœžœ+žœžœžœž#œžœžœEžœžœ/žœ žœžœžžœžœž œž'œžœžœ†žœž œ?žœ«žœžœ žœgžœ žœCžœ!žœžœž œ  œž œžœžœ žœžœžœž œ žœžœžœ žœ žœ}žœž œžœ˜£0—…—&©