-- $Header: Filing4.cr,v 2.0 85/11/21 07:22:38 jqj Exp $ -- Note: this is a TEST version of Filing, and is not guaranteed to -- match the official Xerox version at all. It does seem to be adequate -- for FTP, however. -- $Log: Filing4.cr,v $ -- Revision 2.0 85/11/21 07:22:38 jqj -- 4.3BSD standard release -- -- Revision 1.1 85/05/27 06:30:46 jqj -- Initial revision -- -- Revision 1.1 85/05/27 06:30:46 jqj -- Initial revision -- Filing: PROGRAM 10 VERSION 4 = BEGIN DEPENDS UPON BulkData(0) VERSION 1, Clearinghouse(2) VERSION 2, Authentication(14) VERSION 1, -- should be V 2 -- Time(15) VERSION 2; -- TYPES AND CONSTANTS -- -- Attributes (individual attributes defined later) -- AttributeType: TYPE = LONG CARDINAL; AttributeTypeSequence: TYPE = SEQUENCE OF AttributeType; allAttributeTypes: AttributeTypeSequence = [37777777777B]; Attribute: TYPE = RECORD [type: AttributeType, value: SEQUENCE OF UNSPECIFIED]; AttributeSequence: TYPE = SEQUENCE OF Attribute; -- Controls -- ControlType: TYPE = {lockControl(0), timeoutControl(1), accessControl(2)}; ControlTypeSequence: TYPE = SEQUENCE 3 OF ControlType; Lock: TYPE = {lockNone(0), share(1), exclusive(2)}; Timeout: TYPE = CARDINAL; -- in seconds -- defaultTimeout: Timeout = 177777B; -- actual value impl.-dependent -- AccessType: TYPE = { readAccess(0), writeAccess(1), ownerAccess(2), -- all files -- addAccess(3), removeAccess(4) }; -- directories only -- AccessSequence: TYPE = SEQUENCE 5 OF AccessType; -- fullAccess: AccessSequence = [177777B]; -- Control: TYPE = CHOICE ControlType OF { lockControl => Lock, timeoutControl => Timeout, accessControl => AccessSequence}; ControlSequence: TYPE = SEQUENCE 3 OF Control; -- Scopes -- Count: TYPE = CARDINAL; unlimitedCount: Count = 177777B; Depth: TYPE = CARDINAL; allDescendants: Depth = 177777B; Direction: TYPE = {forward(0), backward(1)}; Interpretation: TYPE = { interpretationNone(0), boolean(1), cardinal(2), longCardinal(3), time(4), integer(5), longInteger(6), string(7) }; FilterType: TYPE = { -- relations -- less(0), lessOrEqual(1), equal(2), notEqual(3), greaterOrEqual(4), greater(5), -- logical -- and(6), or(7), not(8), -- constants -- filterNone(9), all(10), -- patterns -- matches(11) }; RestrictedFilter: TYPE = CHOICE FilterType OF { less, lessOrEqual, equal, notEqual, greaterOrEqual, greater => RECORD [attribute: Attribute, interpretation: Interpretation], -- interpretation ignored if attribute interpreted by -- implementor -- NOT IMPLEMENTED: and, or, not -- filterNone, all => RECORD [], matches => RECORD [attribute: Attribute] }; Filter: TYPE = CHOICE FilterType OF { less, lessOrEqual, equal, notEqual, greaterOrEqual, greater => RECORD [attribute: Attribute, interpretation: Interpretation], -- interpretation ignored if attribute interpreted by -- implementor -- NOT YET IMPLEMENTED: (at least, not generally) and, or, not -- and, or => SEQUENCE OF RestrictedFilter, not => RestrictedFilter, filterNone, all => RECORD [], matches => RECORD [attribute: Attribute] }; nullFilter: Filter = all[]; ScopeType: TYPE = { count(0), direction(1), filter(2), depth(3) }; Scope: TYPE = CHOICE ScopeType OF { count => Count, depth => Depth, direction => Direction, filter => Filter }; ScopeSequence: TYPE = SEQUENCE 4 OF Scope; -- Handles and Authentication -- Credentials: TYPE = Authentication.Credentials; Verifier: TYPE = Authentication.Verifier; SimpleVerifier: TYPE = Authentication.SimpleVerifier; Handle: TYPE = ARRAY 2 OF UNSPECIFIED; nullHandle: Handle = [0,0]; Session: TYPE = RECORD [token: ARRAY 2 OF UNSPECIFIED, verifier: Verifier ]; -- REMOTE ERRORS -- ArgumentProblem: TYPE = { illegal(0), disallowed(1), unreasonable(2), unimplemented(3), duplicated(4), missing(5) }; -- problem with an attribute type or value -- AttributeTypeError: ERROR [ problem: ArgumentProblem, type: AttributeType] = 0; AttributeValueError: ERROR [ problem: ArgumentProblem, type: AttributeType] = 1; -- problem with an control type or value -- ControlTypeError: ERROR [ problem: ArgumentProblem, type: ControlType] = 2; ControlValueError: ERROR [ problem: ArgumentProblem, type: ControlType] = 3; -- problem with an scope type or value -- ScopeTypeError: ERROR [ problem: ArgumentProblem, type: ScopeType] = 4; ScopeValueError: ERROR [ problem: ArgumentProblem, type: ScopeType] = 5; -- problem in obtaining access to a file -- AccessProblem: TYPE = { accessRightsInsufficient(0), accessRightsIndeterminate(1), fileChanged(2), fileDamaged(3), fileInUse(4), fileNotFound(5), fileOpen(6) }; AccessError: ERROR [problem: AccessProblem] = 6; -- problem with a credentials or verifier -- AuthenticationError: ERROR [problem: Authentication.Problem] = 7; -- problem with a BDT -- ConnectionProblem: TYPE = { -- communication problems -- noRoute(0), noResponse(1), transmissionHardware(2), transportTimeout(3), -- resource problems -- tooManyLocalConnections(4), tooManyRemoteConnections(5), -- remote program implementation problems -- missingCourier(6), missingProgram(7), missingProcedure(8), protocolMismatch(9), parameterInconsistency(10), invalidMessage(11), returnTimedOut(12), -- miscellaneous -- otherCallProblem(177777B) }; ConnectionError: ERROR [problem: ConnectionProblem] = 8; -- problem with file handle -- HandleProblem: TYPE = { invalid(0), nullDisallowed(1), directoryRequired(2) }; HandleError: ERROR [problem: HandleProblem] = 9; -- problem during insertion in directory or changing attributes -- InsertionProblem: TYPE = { positionUnavailable(0), fileNotUnique(1), loopInHierarchy(2) }; InsertionError: ERROR [problem: InsertionProblem] = 10; -- problem during random access operation -- RangeError: ERROR [problem: ArgumentProblem] = 16; -- problem during logon or logoff -- ServiceProblem: TYPE = { cannotAuthenticate(0), serviceFull(1), serviceUnavailable(2), sessionInUse(3) }; ServiceError: ERROR [problem: ServiceProblem] = 11; -- problem with a session -- SessionProblem: TYPE = { tokenInvalid(0), serviceAlreadySet(1) }; SessionError: ERROR [problem: SessionProblem ] = 12; -- problem obtaining space for file contents or attributes -- SpaceProblem: TYPE = { allocationExceeded(0), attributeAreadFull(1), mediumFull(2) }; SpaceError: ERROR [problem: SpaceProblem ] = 13; -- problem during BDT -- TransferProblem: TYPE = { aborted(0), checksumIncorrect(1), formatIncorrect(2), noRendevous(3), wrongDirection(4) }; TransferError: ERROR [problem: TransferProblem ] = 14; -- some undefined (and implementation-dependent) problem occurred -- UndefinedProblem: TYPE = CARDINAL; UndefinedError: ERROR [problem: UndefinedProblem ] = 15; -- REMOTE PROCEDURES -- -- Logging On and Off -- Logon: PROCEDURE [ service: Clearinghouse.Name, credentials: Credentials, verifier: Verifier ] RETURNS [ session: Session ] REPORTS [ AuthenticationError, ServiceError, SessionError, UndefinedError ] = 0; Logoff: PROCEDURE [ session: Session ] REPORTS [ AuthenticationError, ServiceError, SessionError, UndefinedError ] = 1; SetService: PROCEDURE [service: Clearinghouse.Name, session: Session ] REPORTS [ AuthenticationError, ServiceError, SessionError, UndefinedError ] = 21; Continue: PROCEDURE [ session: Session ] RETURNS [ continuance: CARDINAL ] REPORTS [ AuthenticationError, SessionError, UndefinedError ] = 19; -- Opening and Closing Files -- Open: PROCEDURE [ attributes: AttributeSequence, directory: Handle, controls: ControlSequence, session: Session ] RETURNS [ file: Handle ] REPORTS [ AccessError, AttributeTypeError, AttributeValueError, AuthenticationError, ControlTypeError, ControlValueError, HandleError, SessionError, UndefinedError ] = 2; Close: PROCEDURE [ file: Handle, session: Session ] REPORTS [ AuthenticationError, HandleError, SessionError, UndefinedError ] = 3; -- Creating and Deleting Files -- Create: PROCEDURE [ directory: Handle, attributes: AttributeSequence, controls: ControlSequence, session: Session ] RETURNS [ file: Handle ] REPORTS [ AccessError, AttributeTypeError, AttributeValueError, AuthenticationError, ControlTypeError, ControlValueError, HandleError, InsertionError, SessionError, SpaceError, UndefinedError ] = 4; Delete: PROCEDURE [ file: Handle, session: Session ] REPORTS [AccessError, AuthenticationError, HandleError, SessionError, UndefinedError ] = 5; -- Getting and Changing Controls (transient) -- GetControls: PROCEDURE [ file: Handle, types: ControlTypeSequence, session: Session ] RETURNS [ controls: ControlSequence ] REPORTS [AccessError, AttributeTypeError, AuthenticationError, ControlTypeError, HandleError, SessionError, UndefinedError ] = 6; ChangeControls: PROCEDURE [ file: Handle, controls: ControlSequence, session: Session ] REPORTS [AccessError, AttributeTypeError, AuthenticationError, ControlTypeError, ControlValueError, HandleError, SessionError, UndefinedError ] = 7; -- Getting and Changing Attributes (permanent) -- GetAttributes: PROCEDURE [ file: Handle, types: AttributeTypeSequence, session: Session ] RETURNS [ attributes: AttributeSequence ] REPORTS [AccessError, AttributeTypeError, AuthenticationError, HandleError, SessionError, UndefinedError ] = 8; ChangeAttributes: PROCEDURE [file: Handle, attributes: AttributeSequence, session: Session ] REPORTS [AccessError, AttributeTypeError, AuthenticationError, HandleError, SessionError, SpaceError, UndefinedError ] = 9; UnifyAccessLists: PROCEDURE [directory: Handle, session: Session ] REPORTS [AccessError, AuthenticationError, HandleError, SessionError, UndefinedError ] = 20; -- Copying and Moving Files -- Copy: PROCEDURE [ file, destinationDirectory: Handle , attributes: AttributeSequence, controls: ControlSequence, awaaion: Session ] RETURNS [ newFile: Handle ] REPORTS [AccessError, AttributeTypeError, AttributeValueError, AuthenticationError, ControlTypeError, ControlValueError, HandleError, InsertionError, SessionError, SpaceError, UndefinedError ] = 10; Move: PROCEDURE [ file, destinationDirectory: Handle , attributes: AttributeSequence, controls: ControlSequence, awaaion: Session ] RETURNS [ newFile: Handle ] REPORTS [AccessError, AttributeTypeError, AttributeValueError, AuthenticationError, HandleError, InsertionError, SessionError, SpaceError, UndefinedError ] = 11; -- Transfering Bulk Data (File Content) -- Store: PROCEDURE [ directory: Handle, attributes: AttributeSequence, controls: ControlSequence, content: BulkData.Source, session: Session ] RETURNS [ file: Handle ] REPORTS [AccessError, AttributeTypeError, AttributeValueError, AuthenticationError, ConnectionError, ControlTypeError, ControlValueError, HandleError, InsertionError, SessionError, SpaceError, TransferError, UndefinedError ] = 12; Retrieve: PROCEDURE [ file: Handle, content: BulkData.Sink, session: Session ] REPORTS [AccessError, AuthenticationError, ConnectionError, HandleError, SessionError, SpaceError, TransferError, UndefinedError ] = 13; Replace: PROCEDURE [ file: Handle, attributes: AttributeSequence, content: BulkData.Source, session: Session ] REPORTS [AccessError, AttributeTypeError, AttributeValueError, AuthenticationError, ConnectionError, HandleError, SessionError, SpaceError, TransferError, UndefinedError ] = 14; -- Transferring Bulk Data (Serialized Files) -- -- NOT YET IMPLEMENTED -- -- Locating and Listing Files in a Directory -- Find: PROCEDURE [ directory: Handle, scope: ScopeSequence, controls: ControlSequence, session: Session ] RETURNS [ file: Handle ] REPORTS [ AccessError, AuthenticationError, ConnectionError, ControlTypeError, ControlValueError, HandleError, ScopeTypeError, ScopeValueError, SessionError, UndefinedError ] = 17; List: PROCEDURE [ directory: Handle, types: AttributeTypeSequence, scope: ScopeSequence, listing: BulkData.Sink, session: Session ] REPORTS [ AccessError, AttributeTypeError, AuthenticationError, ConnectionError, HandleError, ScopeTypeError, ScopeValueError, SessionError, TransferError, UndefinedError ] = 18; -- INTERPRETED ATTRIBUTE DEFINITIONS -- -- common definitions -- Time: TYPE = Time.Time; -- seconds -- nullTime: Time = Time.earliestTime; User: TYPE = Clearinghouse.Name; -- attributes -- checksum: AttributeType = 0; Checksum: TYPE = CARDINAL; unknownChecksum: Checksum = 177777B; childrenUniquelyNamed: AttributeType = 1; ChildrenUniquelyNamed: TYPE = BOOLEAN; createdBy: AttributeType = 2; CreatedBy: TYPE = User; createdOn: AttributeType = 3; CreatedOn: TYPE = Time; dataSize: AttributeType = 16; DataSize: TYPE = LONG CARDINAL; fileID: AttributeType = 4; FileID: TYPE = ARRAY 5 OF UNSPECIFIED; nullFileID: FileID = [0,0,0,0,0]; isDirectory: AttributeType = 5; IsDirectory: TYPE = BOOLEAN; isTemporary: AttributeType = 6; IsTemporary: TYPE = BOOLEAN; modifiedBy: AttributeType = 7; ModifiedBy: TYPE = User; modifiedOn: AttributeType = 8; ModifiedOn: TYPE = Time; name: AttributeType = 9; -- name relative to parent -- Name: TYPE = STRING; -- must not exceed 100 bytes -- numberOfChildren: AttributeType = 10; NumberOfChildren: TYPE = CARDINAL; ordering: AttributeType = 11; Ordering: TYPE = RECORD [key: AttributeType, ascending: BOOLEAN, interpretation: Interpretation]; -- see below for defaultOrdering, byAscendingPosition, byDescendingPosition -- parentID: AttributeType = 12; ParentID: TYPE = FileID; pathname: AttributeType = 21; Pathname: TYPE = STRING; position: AttributeType = 11; Position: TYPE = SEQUENCE 100 OF UNSPECIFIED; firstPosition: Position = [0]; lastPosition: Position = [177777B]; readBy: AttributeType = 14; ReadBy: TYPE = User; readOn: AttributeType = 15; ReadOn: TYPE = Time; subtreeSize: AttributeType = 23; SubtreeSize: TYPE = LONG CARDINAL; subtreeSizeLimit: AttributeType = 24; SubtreeSizeLimit: TYPE = LONG CARDINAL; nullSubtreeSizeLimit: SubtreeSizeLimit = 37777777777B; type: AttributeType = 17; Type: TYPE = LONG CARDINAL; version: AttributeType = 18; Version: TYPE = CARDINAL; lowestVersion: Version = 0; highestVersion: Version = 177777B; defaultOrdering: Ordering = [key: name, ascending: TRUE, interpretation: string]; byAscendingPosition: Ordering = [key: position, ascending: TRUE, interpretation: interpretationNone]; byDescendingPosition: Ordering = [key: position, ascending: FALSE, interpretation: interpretationNone]; -- BULK DATA FORMATS -- -- NOT YET IMPLEMENTED -- -- Attribute Series Format, used in List -- StreamOfAttributeSequence: TYPE = CHOICE OF { nextSegment(0) => RECORD [ segment: SEQUENCE OF AttributeSequence, restOfStream: StreamOfAttributeSequence], lastSegment(1) => SEQUENCE OF AttributeSequence}; -- FILE TYPES -- tUnspecified: Type = 0; tDirectory: Type = 1; tText: Type = 2; tSerialized: Type = 3; END. -- of Filing --