Adobe:
PROGRAM 75
VERSION 2 =
BEGIN
DEPENDS
UPON
BulkData (0) VERSION 1,
CHName (2) VERSION 0,
Time (15) VERSION 2;
Filing (10) VERSION 5;
Common Definitions
nullTime: Time.Time = Time.earliestTime; -- seconds
EmptyRecord: TYPE = RECORD [ ];
Signals and Errors
CommunicationError: ERROR [ ] = 0;
UnknownSystem: ERROR [ ] = 1;
CantDetermineLocOfARs: ERROR [ ] = 2;
IllegalLogin: ERROR [ ] = 3;
SystemAlreadyExists: ERROR [ ] = 4;
FileNotFound: ERROR [ ] = 5;
ServerUnreachable: ERROR [ ] = 6;
ServerDown: ERROR [ ] = 7;
NoAdobeServiceAtServer: ERROR [ ] = 8;
CourierTimedOut: ERROR [ ] = 9;
ParameterInconsistency: ERROR [ ] = 10;
ObsoleteVersion: ERROR [ ] = 11;
SystemNotRegistered: ERROR [ ] = 12;
SysDescChanging: ERROR [ ] = 13;
Others: ERROR [ ] = 14;
TooManyConnections: ERROR [ ] = 15;
Spare1: ERROR [ ] = 16;
Spare2: ERROR [ ] = 17;
Xxx: ERROR [ ] = 31;
Error: ERROR [ why: Problem ] = 99;
Problem: TYPE = { communicationError(0), unknownSystem(1), cantDetermineLocOfARs(2), illegalLogin(3), systemAlreadyExists(4), fileNotFound(5), serverUnreachable(6), serverDown(7), noAdobeServiceAtServer(8), courierTimedOut(9), parameterInconsistency(10), obsoleteVersion(11), systemNotRegistered(12), sysDescChanging(13), others(14), tooManyConnections(15), spare1(16), spare2(17), xxx(31) };
Operational Semantics
The following 3 procedures are to be called when storing (i.e. submit or checkin) an AR; AboutToStore and CompletedUpdate are provided to protect against lost AR edits;
The sequence should be:
AboutToStore[...];
ARAccess.SubmitAR[...] or ARAccess.CheckInAR[...];
UpdateAcceleratorField[...]; -- for each field that changed;
...
UpdateAcceleratorField[...];
CompletedUpdate[...];
Simple Types
ServerName: TYPE = CHName.Name;
Database: TYPE = STRING;
ARVersion: TYPE = LONG CARDINAL;
ARNumber: TYPE = LONG CARDINAL;
SubmitNumber: TYPE = LONG CARDINAL;
Numeric: TYPE = LONG CARDINAL;
DependsOnIndex: TYPE = CARDINAL;
BoundedString: TYPE = RECORD [string: STRING, max: CARDINAL];
StartOrStop: TYPE = { start(0), stop(1) };
Reference: TYPE = SEQUENCE OF UNSPECIFIED;
Reference: TYPE = NSFile.Reference;
Types
DatabaseSequence: TYPE = SEQUENCE OF STRING;
Target: TYPE = RECORD [--server: ServerName,-- system: Database];
StaticTarget: TYPE = RECORD [target: Target, version: ARVersion];
LocationTarget: TYPE = RECORD [host: STRING, directory: STRING];
Database Description
Description:
TYPE =
RECORD [
name: STRING, -- name of the ARSystem
host: STRING, -- file server where the ARs are stored
directory: STRING, -- directory where the ARs are stored
refCount: CARDINAL, -- number of active Adobe tools using this system
version: ARVersion, -- description version
fieldList: FieldList
];
Fields
FieldItemValue: TYPE = FieldItem;
FieldList: TYPE = SEQUENCE OF FieldItem;
FieldType: TYPE = { ar(0), time(1), numeric(2), bounded(3), enumerated(4), string(5) };
FieldItem:
TYPE =
CHOICE FieldType
OF {
ar => ARField, --(0),
time => TimeField, --(1),
numeric => NumericField, --(2),
bounded => BoundedField, --(3),
enumerated => EnumeratedField, --(4),
string => StringField --(5)
};
ARField:
TYPE =
RECORD [
name: STRING,
tools: ToolData,
ar: EmptyRecord
];
TimeField:
TYPE =
RECORD [
name: STRING,
tools: ToolData,
time: EmptyRecord
];
NumericField:
TYPE =
RECORD [
name: STRING,
tools: ToolData,
numeric: EmptyRecord
];
BoundedField:
TYPE =
RECORD [
name: STRING,
tools: ToolData,
bounded: CARDINAL
];
EnumeratedField:
TYPE =
RECORD [
name: STRING,
tools: ToolData,
field: DependsOnIndex,
possibilities: KeyedPossibilitiesList
];
StringField:
TYPE =
RECORD [
name: STRING,
tools: ToolData,
string: EmptyRecord
];
Enumerated
KeyedPossibilitiesList:
TYPE =
SEQUENCE
OF PossibilityList;
length is encoded as a smashed value in the ToolData!
PossibilityList:
TYPE =
RECORD [
keyedDependency: DependsOnIndex,
enumRecs: EnumerationList
];
EnumerationList:
TYPE =
SEQUENCE
OF TaggedItem;
length is encoded improperly and appears both before the field of EnumeratedField for the first case, and before the last keyedDependency in a PossibilityList!
TaggedItem:
TYPE =
RECORD [
tag: STRING,
item: CARDINAL
];
Tool(s) Info
ToolType: TYPE = { edit(0), submit(1), report(2), query(3), sort(4), queryList(5) };
ToolData: TYPE = ARRAY 6 OF InfoStuff;
InfoStuff:
TYPE =
RECORD [
default: STRING,
required: BOOLEAN,
place: Coordinate,
width: CARDINAL
];
Coordinate:
TYPE =
RECORD [
ord: INTEGER,
co: INTEGER
];
Changes
ChangeList: TYPE = SEQUENCE OF ChangeItem;
ChangeItem: TYPE = RECORD [name: STRING, value: ChangeItemValue];
ChangeType: TYPE = { modify(0), add(1), remove(2) };
ChangeItemValue:
TYPE =
CHOICE ChangeType
OF {
add => FieldItemValue, --(0),
modify => FieldItemValue, --(1),
remove => EmptyRecord --(2)
};
Queries
QueryList: TYPE = SEQUENCE OF QueryItem;
QueryItem: TYPE = RECORD [name: STRING, value: QueryItemValue];
Relation: TYPE = { equal(0), notEqual(1), lessThan(2), lessThanOrEqual(3), greaterThan(4), greaterThanOrEqual(5), in(6), notIn(7) };
QueryItemValue: TYPE = RECORD [op: Relation, value: FieldItemValue];
Action Request Set(s)
SetOfARs: TYPE = SEQUENCE OF RunOfARs;
RunOfARs:
TYPE =
RECORD [
ar: ARNumber,
runLength: LONG CARDINAL
];
Procedures
GetResidentSystems: PROCEDURE [ ]
RETURNS [ systems: DatabaseSequence ]
REPORTS [ Error ] = 17;
Procedures
GetVersion: PROCEDURE [ target: Target ]
RETURNS [ version: ARVersion ]
REPORTS [ Error ] = 12;
ReadLastARNumber: PROCEDURE [ target: Target ]
RETURNS [ lastAR: ARNumber ]
REPORTS [ Error ] = 2;
Procedures
GetSystemDescription: PROCEDURE [ target: Target ]
RETURNS [ description: Description ]
REPORTS [ Error ] = 14;
PutSystemDescription: PROCEDURE [ target: Target, description: Description ]
REPORTS [ Error ] = 13;
GetSystemDefaultUserFile: PROCEDURE [ target: Target, to: BulkData.Sink ]
RETURNS [ bytesInFile: CARDINAL ]
REPORTS [ Error ] = 16;
PutSystemDefaultUserFile: PROCEDURE [ target: Target, from: BulkData.Source ]
REPORTS [ Error ] = 15;
GetStartOrStopTime: PROCEDURE [ target: Target, which: StartOrStop ]
RETURNS [ startOrStopTime: Time.Time ]
REPORTS [ Error ] = 20;
PutStartOrStopTime: PROCEDURE [ target: Target, which: StartOrStop, startOrStopTime: Time.Time ]
REPORTS [ Error ] = 19;
GetLocationOfARs: PROCEDURE [ target: Target ]
RETURNS [ referenceToARs: Reference ]
REPORTS [ Error ] = 9;
ChangeLocationOfARs: PROCEDURE [ target: Target, newLocation: LocationTarget ]
REPORTS [ Error ] = 10; <<putLocationOfARs>>
GetNextSubmitNumber: PROCEDURE [ target: Target ]
RETURNS [ submitNumber: SubmitNumber ]
REPORTS [ Error ] = 0;
PutSubmitNumber: PROCEDURE [ target: Target, submitNumber: SubmitNumber ]
REPORTS [ Error ] = 1;
MakeAcceleratorFileForField: PROCEDURE [ target: Target, fieldName: STRING, fieldList: FieldList]
REPORTS [ Error ] = 22;
UpdateAccelerators: PROCEDURE [ target: Target, arSet: SetOfARs ]
REPORTS [ Error ] = 5;
CompletedUpdate: PROCEDURE [ target: Target, arNumber: ARNumber ]
REPORTS [ Error ] = 8;
Procedures
AboutToStore: PROCEDURE [ instance: StaticTarget, arNumber: ARNumber ]
REPORTS [ Error ] = 6;
ChangeFieldList: PROCEDURE [ instance: StaticTarget, changes: ChangeList ]
REPORTS [ Error ] = 11; <<putVersionID>>
GetAcceleratorInfo: PROCEDURE [ instance: StaticTarget, arSet: SetOfARs, fieldList: FieldList, to: BulkData.Sink ]
REPORTS [ Error ] = 21;
LookupARs: PROCEDURE [ instance: StaticTarget, query: QueryItem, boundSet: SetOfARs ]
RETURNS [ arSet: SetOfARs ]
REPORTS [ Error ] = 4;
UpdateAcceleratorField: PROCEDURE [ instance: StaticTarget, arNumber: ARNumber, field: FieldItem ]
REPORTS [ Error ] = 7;
VerifyVersion: PROCEDURE [ instance: StaticTarget ]
RETURNS [ok: BOOLEAN]
REPORTS [ Error ] = 18;
Procedures
SubmitFailed: PROCEDURE [ target: Target, arNumber: ARNumber, version: ARVersion ]
REPORTS [ Error ] = 3;
END.