<<>> <> <> <> <> DIRECTORY BasicTime USING [GMT], IO USING [STREAM], Imager USING [Context], Rope USING [ROPE]; DecomposerRegistry: CEDAR DEFINITIONS = BEGIN OPEN IO, Rope; <> <> <<>> Register: PROC [data: DecomposerData]; <<>> <> <> <<$IP Interpress>> <<$PS PostScript>> <<$PCL HP PCL>> <<>> UnRegister: PROC [data: DecomposerData]; <<>> <> Lookup: PROC [key: ATOM] RETURNS [DecomposerData]; <<>> <> <<>> Enumerate: PROC RETURNS [LIST OF DecomposerData]; <<>> <> <> <> <<>> Attribute: TYPE = ATOM; Value: TYPE = REF ValueRep; ValueRep: TYPE = RECORD [ SELECT tag: ValueTag FROM cardinal => [cardinal: CARD32], integer => [integer: INT32], boolean => [boolean: BOOLEAN], real => [real: REAL], text => [text: Rope.ROPE], time => [time: BasicTime.GMT], sequence => [sequence: ValueSeq] ENDCASE ]; ValueTag: TYPE = {cardinal, integer, boolean, real, text, time, sequence}; ValueSeq: TYPE = REF ValueSeqRep; ValueSeqRep: TYPE = RECORD [SEQUENCE len: NAT OF Value]; MakeBoolVal: PROC [b: BOOL] RETURNS [Value]; MakeCardVal: PROC [c: CARD32] RETURNS [Value]; MakeIntVal: PROC [i: INT32] RETURNS [Value]; MakeTimeVal: PROC [gmt: BasicTime.GMT] RETURNS [Value]; MakeTextVal: PROC [rope: Rope.ROPE] RETURNS [Value]; MakeSeqVal1: PROC [val: Value] RETURNS [Value]; MakeSeqVal2: PROC [val1, val2: Value] RETURNS [Value]; MakeSeqValList: PROC [list: LIST OF Value] RETURNS [Value]; <> <> <<>> DecomposerData: TYPE = REF DecomposerDataRep; DecomposerDataRep: TYPE = RECORD [ key: ATOM _ NIL, -- the key for the decomposer doc: ROPE _ NIL, -- a brief description of the decomposer procs: REF DecomposerProcs _ NIL, -- procs supplied by the decomposer private: REF _ NIL -- private data for the decomposer ]; DecomposerProcs: TYPE = RECORD [ guess: GuessProc, -- proc to guess PDL suitability open: OpenProc, -- proc to open a document instance clean: CleanProc -- proc to clean up caches ]; GuessProc: TYPE = PROC [data: DecomposerData, seq: SequencerData] RETURNS [REAL]; <<>> <> <<>> <> <<>> <> <> <<>> OpenProc: TYPE = PROC [data: DecomposerData, seq: SequencerData] RETURNS [InstanceData]; <<>> <> <<>> <> <<>> CleanProc: TYPE = PROC [data: DecomposerData]; <<>> <> <> <> <<>> SequencerData: TYPE = REF SequencerDataRep; SequencerDataRep: TYPE = RECORD [ in: STREAM _ NIL, -- input stream out: STREAM _ NIL, -- normal output stream for message err: STREAM _ NIL, -- error output stream for message title: ROPE _ NIL, -- job title (optional) user: ROPE _ NIL, -- user name (optional) file: ROPE _ NIL, -- file name (optional) userTime: CARD _ 0, -- milliseconds of user+system cpu time flags: SequencerFlags _ [], -- sequencer flags procs: REF SequencerProcs _ NIL, -- sequencer operations private: REF _ NIL -- sequencer private data ]; SequencerFlags: TYPE = MACHINE DEPENDENT RECORD [ reverse: BOOL _ FALSE, -- reverse page imaging (N to 1) requested debug: BOOL _ FALSE, -- debugging info requested imaging: BOOL _ FALSE -- hint: imaging expected ]; <> SequencerProcs: TYPE = RECORD [ feedback: FeedbackProc, -- proc to report an event getAttr: GetAttrProc, -- proc to get an attribute setAttr: SetAttrProc -- proc to set an attribute ]; FeedbackProc: TYPE = PROC [instance: InstanceData, key: ATOM, severity: Severity, info: REF]; Severity: TYPE = {comment, warning, error, fatal}; FeedbackResult: TYPE = {continue, abort}; UncaughtInfo: TYPE = REF UncaughtInfoRep; UncaughtInfoRep: TYPE = RECORD [ signal: SIGNAL ANY RETURNS ANY, parameters: WORD]; <> <<>> <> <<>> <> <<>> GetAttrProc: TYPE = PROC [sd: SequencerData, key: Attribute] RETURNS [ValueSeq]; <<>> <> <<>> SetAttrProc: TYPE = PROC [sd: SequencerData, key: Attribute, values: ValueSeq]; <<>> <> <> InstanceData: TYPE = REF InstanceDataRep; InstanceDataRep: TYPE = RECORD [ decomposer: DecomposerData _ NIL, -- decomposer object sequencer: SequencerData _ NIL, -- sequencer object context: Imager.Context _ NIL, -- current imager context flags: InstanceFlags _ [], -- instance flags copies: INT _ 0, -- requested copies (< 0 => not known) copy: INT _ 0, -- current copy # pages: INT _ 0, -- # of pages (< 0 => not known) page: INT _ 0, -- current page # procs: REF InstanceProcs _ NIL, -- operations on document instances private: REF _ NIL -- document instance private data ]; InstanceFlags: TYPE = MACHINE DEPENDENT RECORD [ reverse: BOOL _ FALSE, -- => reverse page order granted randomAccess: BOOL _ FALSE, -- => random access to pages supported pageContext: BOOL _ FALSE -- => new context needed for each page ]; <<>> <> <<>> <> <<>> <> <<>> InstanceProcs: TYPE = RECORD [ attributes: AttributesProc, -- proc to visit the attributes page: PageProc, -- proc to image a page close: CloseProc, -- proc to close an instance clone: CloneProc _ NIL, -- proc to clone an instance (optional) special: SpecialProc _ NIL -- special operations (optional) ]; AttributesProc: TYPE = PROC [instance: InstanceData]; <<>> <> <<>> PageProc: TYPE = PROC [instance: InstanceData, page: CARDINAL, copy: CARDINAL] RETURNS [PageFlags]; <> PageFlags: TYPE = MACHINE DEPENDENT RECORD [ pageFailed: BOOL _ FALSE, -- page could not be decomposed docFailed: BOOL _ FALSE, -- document can no longer be decomposed imaged: BOOL _ FALSE, -- page had contents to image copyPage: BOOL _ FALSE, -- initialize next page to this one willErase: BOOL _ FALSE, -- next page will be erased allCopies: BOOL _ FALSE, -- results are good for all copies last: BOOL _ FALSE -- page was last page in document ]; <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> CloseProc: TYPE = PROC [instance: InstanceData]; <<>> <> <<>> CloneProc: TYPE = PROC [instance: InstanceData] RETURNS [InstanceData]; <<>> <> <<>> <> <<>> SpecialProc: TYPE = PROC [instance: InstanceData, op: ATOM, args: LIST OF REF] RETURNS [REF]; <<>> <> END.