<<>> <> <> <> <> CHOps: PROGRAM 2 VERSION 3 = BEGIN DEPENDS UPON BulkData (0) VERSION 1, CHName (2) VERSION 0, Authentication (14) VERSION 2; <> <<>> Organization: TYPE = CHName.Organization; OrganizationName: TYPE = CHName.OrganizationName; Domain: TYPE = CHName.Domain; DomainName: TYPE = CHName.DomainName; Object: TYPE = CHName.Object; ObjectName: TYPE = CHName.ObjectName; Name: TYPE = CHName.Name; TwoPartName: TYPE = CHName.TwoPartName; ThreePartName: TYPE = CHName.ThreePartName; OrganizationNamePattern: TYPE = CHName.Organization; DomainNamePattern: TYPE = CHName.TwoPartName; ObjectNamePattern: TYPE = CHName.ThreePartName; <> StreamKind: TYPE = { nextSegment(0), lastSegment(1) }; StreamOfDomain: TYPE = CHOICE StreamKind OF { nextSegment => DomainSequence, -- (0) lastSegment => DomainSequence -- (1) }; DomainSequence: TYPE = SEQUENCE OF Domain; StreamOfDomainName: TYPE = CHOICE StreamKind OF { nextSegment => DomainNameSequence, -- (0) lastSegment => DomainNameSequence -- (1) }; DomainNameSequence: TYPE = SEQUENCE OF DomainName; StreamOfObject: TYPE = CHOICE StreamKind OF { nextSegment => ObjectSequence, -- (0) lastSegment => ObjectSequence -- (1) }; ObjectSequence: TYPE = SEQUENCE OF Object; StreamOfObjectName: TYPE = CHOICE StreamKind OF { nextSegment => ObjectNameSequence, -- (0) lastSegment => ObjectNameSequence -- (1) }; ObjectNameSequence: TYPE = SEQUENCE OF ObjectName; StreamOfOrganization: TYPE = CHOICE StreamKind OF { nextSegment => OrganizationSequence, -- (0) lastSegment => OrganizationSequence -- (1) }; OrganizationSequence: TYPE = SEQUENCE OF Organization; StreamOfThreePartName: TYPE = CHOICE StreamKind OF { nextSegment => ThreePartNameSequence, -- (0) lastSegment => ThreePartNameSequence -- (1) }; ThreePartNameSequence: TYPE = SEQUENCE OF ThreePartName; <> Property: TYPE = LONG CARDINAL; Properties: TYPE = SEQUENCE 250 OF Property; all: Property = 0; nullProperty: Property = 37777777777B; Item: TYPE = SEQUENCE 500 OF UNSPECIFIED; -- value of an item property <> NetworkNumber: TYPE = ARRAY 2 OF UNSPECIFIED; HostNumber: TYPE = ARRAY 3 OF UNSPECIFIED; SocketNumber: TYPE = UNSPECIFIED; NetworkAddress: TYPE = RECORD [ network: NetworkNumber, host: HostNumber, socket: SocketNumber ]; NetworkAddressList: TYPE = SEQUENCE 40 OF NetworkAddress; <> Authenticator: TYPE = RECORD [ credentials: Authentication.Credentials, verifier: Authentication.Verifier ]; <> <<>> wildcard: STRING = "*"; -- the wildcard character (asterisk) <<>> <> <> CreateObject: PROCEDURE [name: ObjectName, agent: Authenticator] REPORTS [ArgumentError, AuthenticationError, CallError, UpdateError, WrongServer] = 2; DeleteObject: PROCEDURE [name: ObjectName, agent: Authenticator] REPORTS [ArgumentError, AuthenticationError, CallError, UpdateError, WrongServer] = 3; LookupObject: PROCEDURE [name: ObjectNamePattern, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, WrongServer] = 4; ListOrganizations: PROCEDURE [pattern: OrganizationName--Pattern--, list: BulkData.Sink, agent: Authenticator] REPORTS [ArgumentError, AuthenticationError, CallError, WrongServer] = 5; ListDomains: PROCEDURE [pattern: DomainNamePattern, list: BulkData.Sink, agent: Authenticator] REPORTS [ArgumentError, AuthenticationError, CallError, WrongServer] = 6; ListObjects: PROCEDURE [pattern: ObjectNamePattern, property: Property, list: BulkData.Sink, agent: Authenticator] REPORTS [ArgumentError, AuthenticationError, CallError, WrongServer] = 7; ListAliasesOf: PROCEDURE [pattern: ObjectNamePattern, list: BulkData.Sink, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, WrongServer] = 9; <> CreateAlias: PROCEDURE [alias, sameAs: ObjectName, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, UpdateError, WrongServer] = 10; DeleteAlias: PROCEDURE [alias: ObjectName, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, UpdateError, WrongServer] = 11; ListAliases: PROCEDURE [pattern: ObjectNamePattern, list: BulkData.Sink, agent: Authenticator] REPORTS [ArgumentError, AuthenticationError, CallError, WrongServer] = 8; <> DeleteProperty: PROCEDURE [name: ObjectName, property: Property, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, UpdateError, WrongServer] = 14; ListProperties: PROCEDURE [pattern: ObjectNamePattern, agent: Authenticator] RETURNS [distinguishedObject: ObjectName, properties: Properties] REPORTS [ArgumentError, AuthenticationError, CallError, WrongServer] = 15; <> AddItemProperty: PROCEDURE [name: ObjectName, newProperty: Property, value: Item, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, UpdateError, WrongServer] = 13; RetrieveItem: PROCEDURE [pattern: ObjectNamePattern, property: Property, agent: Authenticator] RETURNS [distinguishedObject: ObjectName, value: Item] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, WrongServer] = 16; ChangeItem: PROCEDURE [name: ObjectName, property: Property, newValue: Item, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, UpdateError, WrongServer] = 17; <> AddGroupProperty: PROCEDURE [name: ObjectName, newProperty: Property, membership: BulkData.Source, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, UpdateError, WrongServer] = 12; RetrieveMembers: PROCEDURE [pattern: ObjectNamePattern, property: Property, membership: BulkData.Sink, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, WrongServer] = 18; AddMember: PROCEDURE [name: ObjectName, property: Property, newMember: ThreePartName, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, UpdateError, WrongServer] = 19; AddSelf: PROCEDURE [name: ObjectName, property: Property, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, UpdateError, WrongServer] = 20; DeleteMember: PROCEDURE [name: ObjectName, property: Property, member: ThreePartName, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, UpdateError, WrongServer] = 21; DeleteSelf: PROCEDURE [name: ObjectName, property: Property, agent: Authenticator] RETURNS [distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, UpdateError, WrongServer] = 22; IsMember: PROCEDURE [memberOf: ObjectNamePattern, property, secondaryProperty: Property, name: ThreePartName, agent: Authenticator] RETURNS [isMember: BOOLEAN, distinguishedObject: ObjectName] REPORTS [ArgumentError, AuthenticationError, CallError, PropertyError, WrongServer] = 23; <> RetrieveAddresses: PROCEDURE RETURNS [address: NetworkAddressList] REPORTS [CallError] = 0; ListDomainsServed: PROCEDURE [domains: BulkData.Sink, agent: Authenticator] REPORTS [AuthenticationError, CallError] = 1; <> WhichArgument: TYPE = { first(1), -- concerns the first name or property argument second(2) -- concerns the second name or property argument }; ArgumentError: ERROR [problem: ArgumentProblem, which: WhichArgument] = 2; ArgumentProblem: TYPE = { illegalProperty(10), -- property is not usable by a client illegalOrganizationName(11), -- the organization component of the name is incorrect, e.g., too long or short, or has wild card characters when not allowed illegalDomainName(12), -- the domain component of the name is incorrect, e.g., too long or short, or has wild card characters when not allowed illegalObjectName(13), -- the object component of the name is incorrect, e.g., too long or short, or has wild card characters when not allowed noSuchOrganization(14), -- the name's organization component does not exist noSuchDomain(15), -- the name's domain component does not exist noSuchObject(16) -- the name's object component does not exist }; AuthenticationError: ERROR [problem: Authentication.Problem] = 6; CallError: ERROR [problem: CallProblem] = 1; CallProblem: TYPE = { accessRightsInsufficient(1), -- operation prevented by access controls tooBusy(2), -- server is too busy to service this request serverDown(3), -- a remote Clearinghouse server was down and was needed for this request useCourier(4), -- server insists that Courier be used for this particular request other(5) }; PropertyError: ERROR [problem: PropertyProblem, distinguishedObject: ObjectName] = 3; PropertyProblem: TYPE = { missing(20), -- the object exists, but the property doesn't wrongType(21) -- client wanted a Group but it was an Item, or vice versa }; UpdateError: ERROR [problem: UpdateProblem, found: BOOLEAN, which: WhichArgument, distinguishedObject: ObjectName] = 4; UpdateProblem: TYPE = { noChange(30), -- operation wouldn't change the database outOfDate(31), -- more recent information was in database objectOverflow(32), -- the particular object will have too much data associated with it databaseOverflow(33) -- the server has run out of room }; WrongServer: ERROR [hint: ObjectName] = 5; END.