DIRECTORY AlpineEnvironment USING[AccessRights, FileID, LockFailure, LockOption, NeededAccess, OpenFileID, OperationFailure, OwnerName, PageCount, PageRun, PropertyValuePair, RecoveryOption, ReferencePattern, TransID, nullTransID, UniversalFile, UnknownType, VolOrVolGroupID], AlpFile USING[Handle, Object, PropertySet, RESULTPageBuffer, VALUEPageBuffer, UserProperties, UserPropertyValuePairs, CachePageLockConversion, CachePageLockConversions], AlpineFile USING[AccessFailed, LockFailed, OperationFailed, PossiblyDamaged, StaticallyInvalid, Unknown], AlpPrivate USING[NoticeUnboundInstance], AlpTransaction USING[Handle], RPC USING[CallFailed], AlpineFileRpcControl; AlpFileImpl: CEDAR PROGRAM IMPORTS AF: AlpineFile, AlpP: AlpPrivate, RPC, AlpineFileRpcControl EXPORTS AlpFile = BEGIN OPEN AlpF: AlpFile, AE: AlpineEnvironment, AlpT: AlpTransaction; Open: PUBLIC PROCEDURE [transHandle: AlpT.Handle, universalFile: AE.UniversalFile, access: AE.AccessRights, lock: AE.LockOption, recoveryOption: AE.RecoveryOption, referencePattern: AE.ReferencePattern] RETURNS[handle: AlpF.Handle, fileID: AE.FileID] = BEGIN openFileID: AE.OpenFileID; TRUSTED BEGIN [openFileID, fileID] _ transHandle.inst.file.Open[transHandle.inst.conversation, transHandle.transID, universalFile, access, lock, recoveryOption, referencePattern ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[transHandle.inst]]; END; handle _ NEW[AlpF.Object _ [trans: transHandle, openFileID: openFileID]]; END; Create: PUBLIC PROCEDURE [transHandle: AlpT.Handle, volumeID: AE.VolOrVolGroupID, owner: AE.OwnerName, initialSize: AE.PageCount, recoveryOption: AE.RecoveryOption, referencePattern: AE.ReferencePattern] RETURNS[handle: AlpF.Handle, refUniversalFile: REF AE.UniversalFile] = BEGIN ENABLE RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[transHandle.inst]; openFileID: AE.OpenFileID; universalFile: AE.UniversalFile; TRUSTED BEGIN [openFileID, universalFile] _ transHandle.inst.file.Create[transHandle.inst.conversation, transHandle.transID, volumeID, owner, initialSize, recoveryOption, referencePattern]; END; handle _ NEW[AlpF.Object _ [trans: transHandle, openFileID: openFileID]]; refUniversalFile _ NEW[AE.UniversalFile _universalFile]; END; Close: PUBLIC PROCEDURE[handle: AlpF.Handle] = TRUSTED BEGIN handle.trans.inst.file.Close[handle.trans.inst.conversation, handle.openFileID ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; Delete: PUBLIC PROCEDURE[handle: AlpF.Handle] = TRUSTED BEGIN handle.trans.inst.file.Delete[handle.trans.inst.conversation, handle.openFileID ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; ReadPages: PUBLIC UNSAFE PROCEDURE [handle: AlpF.Handle, pageRun: AE.PageRun, pageBuffer: AlpF.RESULTPageBuffer, lock: AE.LockOption, cacheTrans: AE.TransID _ AE.nullTransID] = TRUSTED BEGIN handle.trans.inst.file.ReadPages[handle.trans.inst.conversation, handle.openFileID, pageRun, pageBuffer, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; WritePages: PUBLIC PROCEDURE[handle: AlpF.Handle, pageRun: AE.PageRun, pageBuffer: AlpF.VALUEPageBuffer, lock: AE.LockOption] = TRUSTED BEGIN handle.trans.inst.file.WritePages[handle.trans.inst.conversation, handle.openFileID, pageRun, pageBuffer, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; ReadProperties: PUBLIC PROCEDURE [handle: AlpF.Handle, desiredProperties: AlpF.PropertySet, lock: AE.LockOption] RETURNS[properties: LIST OF AE.PropertyValuePair] = TRUSTED BEGIN RETURN[handle.trans.inst.file.ReadProperties[handle.trans.inst.conversation, handle.openFileID, desiredProperties, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]]; END; WriteProperties: PUBLIC PROCEDURE [handle: AlpF.Handle, properties: LIST OF AE.PropertyValuePair, lock: AE.LockOption] = TRUSTED BEGIN handle.trans.inst.file.WriteProperties[handle.trans.inst.conversation, handle.openFileID, properties, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; ReadUserProperties: PUBLIC PROCEDURE [handle: AlpF.Handle, desiredProperties: AlpF.UserProperties, lock: AE.LockOption _ [read, wait]] RETURNS [properties: AlpF.UserPropertyValuePairs] = TRUSTED BEGIN RETURN [handle.trans.inst.file.ReadUserProperties[handle.trans.inst.conversation, handle.openFileID, desiredProperties, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]]; END; WriteUserProperties: PUBLIC PROCEDURE [handle: AlpF.Handle, properties: AlpF.UserPropertyValuePairs, lock: AE.LockOption _ [write, wait]] = TRUSTED BEGIN handle.trans.inst.file.WriteUserProperties[handle.trans.inst.conversation, handle.openFileID, properties, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; LockPages: PUBLIC PROCEDURE [handle: AlpF.Handle, pageRun: AE.PageRun, lock: AE.LockOption] = TRUSTED BEGIN handle.trans.inst.file.LockPages[handle.trans.inst.conversation, handle.openFileID, pageRun, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; UnlockPages: PUBLIC PROCEDURE [handle: AlpF.Handle, pageRun: AE.PageRun, retainCacheLocks: BOOLEAN _ FALSE] = TRUSTED BEGIN handle.trans.inst.file.UnlockPages[handle.trans.inst.conversation, handle.openFileID, pageRun, retainCacheLocks ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; ValidateCachePageLock: PUBLIC PROC [lock: AlpF.CachePageLockConversion] RETURNS [success: BOOLEAN] = TRUSTED BEGIN END; ValidateCachePageLocks: PUBLIC PROC [locks: AlpF.CachePageLockConversions] RETURNS [locksGranted, locksNotGranted: AlpF.CachePageLockConversions] = TRUSTED BEGIN END; GetAccessRights: PUBLIC PROCEDURE[handle: AlpF.Handle] RETURNS[access: AE.AccessRights] = TRUSTED BEGIN RETURN[handle.trans.inst.file.GetAccessRights[handle.trans.inst.conversation, handle.openFileID ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]]; END; GetLockOption: PUBLIC PROCEDURE[handle: AlpF.Handle] RETURNS[lock: AE.LockOption] = TRUSTED BEGIN RETURN[handle.trans.inst.file.GetLockOption[handle.trans.inst.conversation, handle.openFileID ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]]; END; SetLockOption: PUBLIC PROCEDURE[handle: AlpF.Handle, lock: AE.LockOption] = TRUSTED BEGIN handle.trans.inst.file.SetLockOption[handle.trans.inst.conversation, handle.openFileID, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; GetRecoveryOption: PUBLIC PROCEDURE[handle: AlpF.Handle] RETURNS[recoveryOption: AE.RecoveryOption] = TRUSTED BEGIN RETURN[handle.trans.inst.file.GetRecoveryOption[handle.trans.inst.conversation, handle.openFileID ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]]; END; GetReferencePattern: PUBLIC PROCEDURE[handle: AlpF.Handle] RETURNS[referencePattern: AE.ReferencePattern] = TRUSTED BEGIN RETURN[handle.trans.inst.file.GetReferencePattern[handle.trans.inst.conversation, handle.openFileID ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]]; END; SetReferencePattern: PUBLIC PROCEDURE[handle: AlpF.Handle, referencePattern: AE.ReferencePattern] = TRUSTED BEGIN handle.trans.inst.file.SetReferencePattern[handle.trans.inst.conversation, handle.openFileID, referencePattern ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; GetSize: PUBLIC PROCEDURE[handle: AlpF.Handle, lock: AE.LockOption] RETURNS[size: AE.PageCount] = TRUSTED BEGIN RETURN[handle.trans.inst.file.GetSize[handle.trans.inst.conversation, handle.openFileID, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]]; END; SetSize: PUBLIC PROCEDURE[handle: AlpF.Handle, size: AE.PageCount, lock: AE.LockOption] = TRUSTED BEGIN handle.trans.inst.file.SetSize[handle.trans.inst.conversation, handle.openFileID, size, lock ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; GetUniversalFile: PUBLIC PROCEDURE[handle: AlpF.Handle] RETURNS[universalFile: AE.UniversalFile] = TRUSTED BEGIN universalFile _ handle.trans.inst.file.GetUniversalFile[handle.trans.inst.conversation, handle.openFileID ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; UnlockVersion: PUBLIC PROCEDURE[handle: AlpF.Handle] = TRUSTED BEGIN handle.trans.inst.file.UnlockVersion[handle.trans.inst.conversation, handle.openFileID ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; IncrementVersion: PUBLIC PROCEDURE[handle: AlpF.Handle, increment: INT] = TRUSTED BEGIN handle.trans.inst.file.IncrementVersion[handle.trans.inst.conversation, handle.openFileID, increment ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; UnlockFile: PUBLIC PROCEDURE[handle: AlpF.Handle, retainCacheLocks: BOOLEAN _ FALSE] = TRUSTED BEGIN handle.trans.inst.file.UnlockFile[handle.trans.inst.conversation, handle.openFileID, retainCacheLocks ! RPC.CallFailed => IF why = unbound OR why = timeout THEN AlpP.NoticeUnboundInstance[handle.trans.inst]]; END; AccessFailed: PUBLIC ERROR [missingAccess: AE.NeededAccess] _ AF.AccessFailed; LockFailed: PUBLIC ERROR [why: AE.LockFailure] _ AF.LockFailed; OperationFailed: PUBLIC ERROR [why: AE.OperationFailure] _ AF.OperationFailed; StaticallyInvalid: PUBLIC ERROR _ AF.StaticallyInvalid; Unknown: PUBLIC ERROR [what: AE.UnknownType] _ AF.Unknown; PossiblyDamaged: PUBLIC SIGNAL _ LOOPHOLE[AF.PossiblyDamaged]; END. Edit Log Initial: Kolling: February 14, 1983 5:08 pm: package to aid clients, in conjunction with AlpInstance and AlpTransaction. ˜AlpFileImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Last edited by Kolling on October 20, 1983 6:24 am MBrown on February 1, 1984 8:08:19 pm PST Carl Hauser, June 18, 1986 11:00:36 am PDT in addition to the errors documented for the corresponding Alpine procedures, all of the procedures defined in this interface can also error RPC.CallFailed[RPC.CallFailure]. Body Body Ê 9˜šœ™Icodešœ Ïmœ1™<—šœ™Jšœ#™#Jšœ)™)K™*—J˜J˜JšÏk ˜ ˜˜šžœ=˜BJ˜OJ˜e——˜Jšžœœ˜¡—˜ šžœ<˜AJ˜——˜ Jšžœ˜—˜Jšžœ ˜—šž˜Jšžœ ˜—J˜—J˜J˜šÏn œžœžœ˜Jšžœžœ žœ˜CJšžœ ˜—J˜Jšžœžœžœ*˜FJ˜J˜Jšœ­™­J˜šŸœžœž ˜Jš œ*žœžœžœžœ#žœ˜´Jšžœžœ ˜0šœž˜Jšœ žœ ˜šžœžœQ˜^J˜Ršœžœžœžœž˜:Jšœ/žœ˜3—Jšœ žœ=˜I—Jšžœ˜J˜——šŸœžœž ˜Jš œ%žœžœžœžœ#žœ˜³Jšžœ(žœžœ˜Ešœž˜šžœžœžœžœ˜:Jšžœ.˜2Jšœ žœ ˜—Jšœžœ˜ šžœžœ˜+J˜ZJšœ7žœ˜;—Jšœ žœ=˜IJšœžœžœ˜8Jšžœ˜——J˜šŸœžœž œ˜.šžœžœ˜šœN˜Nšœžœžœžœž˜:J˜1——Jšžœ˜—J˜—šŸœžœž œ˜/šžœžœ˜šœO˜Ošœžœžœžœž˜;J˜1——Jšžœ˜——J˜šŸ œžœžœž ˜"Jšœžœ3žœ6˜Œšœžœžœ˜šœ@˜@J˜,šœžœžœžœž˜:J˜1——Jšžœ˜——J˜šŸ œžœž œžœ˜RJšœžœ ˜+šœžœžœ˜šœA˜A˜,šœžœžœžœž˜:J˜1———Jšžœ˜——J˜šŸœžœž ˜ JšœAžœ ˜PJšžœ žœžœžœ˜2šœžœžœ˜šžœr˜xšœžœžœžœž˜:J˜2——Jšžœ˜——J˜šŸœžœž ˜!Jšœ"žœžœžœ ˜Ušœžœžœ˜šœk˜kšœžœžœžœž˜:J˜1——Jšžœ˜——J˜šŸœžœ˜%Kšœb˜bKšžœ+˜2šœžœžœ˜šžœw˜}šœžœžœžœž˜:J˜2——Kšžœ˜——K˜šŸœžœ˜&KšœEžœ˜dšœžœž˜šœo˜ošœžœžœžœž˜:J˜1——Kšžœ˜——K˜šŸ œžœž ˜Jšœžœžœ ˜@šœžœžœ˜šœb˜bšœžœžœžœž˜:J˜1——Jšžœ˜——J˜šŸ œžœž ˜Jšœžœžœžœ˜Nšœžœžœ˜Kšœp˜pšœžœžœžœž˜:J˜1——Jšžœ˜—J˜šŸœž œ&˜HKšžœ žœ˜šœžœž˜KšÏtœ ™Kšžœ˜——K˜šŸœž œ(˜KKšžœ?˜Fšœžœž˜Kš œ ™Kšžœ˜——K˜š Ÿœžœž œžœžœ˜Xšœžœžœ˜šžœZ˜`šœžœžœžœž˜:J˜2——Jšžœ˜——J˜š Ÿ œžœž œžœžœ ˜Ršœžœžœ˜šžœW˜]šœžœžœžœž˜:J˜2——Jšžœ˜——J˜šŸ œžœž œžœ ˜Jšœžœžœ˜šœ\˜\šœžœžœžœž˜:J˜1——Jšžœ˜——J˜šŸœžœž œ˜9Jšžœžœ˜+šž œž˜šžœ\˜bšœžœžœžœž˜:J˜2——Jšžœ˜——J˜šŸœžœž œžœ˜Tšžœžœž˜$šžœK˜QJ˜šœžœžœžœž˜:J˜2——Jšžœ˜——J˜šŸœžœž œ'˜Lšžœžœž˜$šœo˜ošœžœžœžœž˜:J˜1——Jšžœ˜——J˜š Ÿœžœž œžœ žœ˜Qšžœžœžœ˜šžœW˜]šœžœžœžœž˜:J˜2——Jšžœ˜——J˜š Ÿœžœž œžœžœ˜Yšžœžœ˜šœ\˜\šœžœžœžœž˜:J˜1——Jšžœ˜——J˜šŸœžœž œžœ˜Nšžœžœžœ˜"šœ˜J˜Yšœžœžœžœž˜:J˜1——Jšžœ˜——J˜š Ÿ œžœž œžœžœ˜EšœV˜Všœžœžœžœž˜:J˜1——Jšžœ˜—J˜š Ÿœžœž œ!žœžœžœ˜Xšœd˜dšœžœžœžœž˜:J˜1——Jšžœ˜J˜—š Ÿ œžœž œ(žœžœ˜Ušœžœžœ˜šœf˜fšœžœžœžœž˜:J˜1——Jšžœ˜——J˜Jš Ÿ œžœžœžœžœ˜NJš Ÿ œžœžœžœžœ ˜?Jš Ÿœžœžœžœžœ˜NJšŸœžœžœžœ˜7Jš Ÿœžœžœžœžœ ˜:Jš Ÿœžœžœžœžœ˜>J˜J˜J˜šžœ˜J˜—J˜JšŸœs˜zJ˜J˜J˜—…—).5ÿ