<<>> <> <> <> <> DIRECTORY BasicTime USING [GMT, nullGMT], IO USING [STREAM], Rope USING [ROPE], PrintingP4V3; XNSPrint: CEDAR DEFINITIONS ~ { OPEN Printing: PrintingP4V3; ROPE: TYPE ~ Rope.ROPE; <> <<>> <> <<>> <> <<>> <> <<>> FormatterStatus: TYPE ~ Printing.FormatterStatus; InterpressMasterStatus: TYPE ~ Printing.InterpressMasterStatus; MarkingEngineStatus: TYPE ~ Printing.MarkingEngineStatus; PaperDimensions: TYPE ~ Printing.PaperDimensions; SpoolerStatus: TYPE ~ Printing.SpoolerStatus; <> <<>> <> <<>> Problem: TYPE ~ { connection, -- network transport error file, -- some FS error, such as the named file does not exist name, -- address database does not contain this host name protocol, -- fatal, somebody got their spec confused! service, -- printer (totally) unable to complete request serviceRetry, -- printer (temporarily) unable to complete request stream, -- some stream error encountered when shipping data unknown -- unexpected transport error, and catchall }; Error: ERROR [problem: Problem, explanation: ROPE]; FIREWALL: ERROR; -- nobody should see and/or catch this one! <<>> <> <<>> <> <<>> Media: TYPE ~ LIST OF AvailableKind; AvailableKind: TYPE ~ ROPE; -- considered opaque, the rope is a convenience <<>> GetPaperDimensions: PROC [s: AvailableKind] RETURNS [size: PaperDimensions ¬ [0, 0]]; <> <> <> <<>> ListAvailableKinds: PROC [] RETURNS [list: Media ¬ NIL]; <> <> Properties: TYPE ~ RECORD [ media: Media, staple: BOOL, twoSided: BOOL ]; GetPrinterProperties: PROC [printer: ROPE] RETURNS [service: ROPE, answer: Properties]; <> PrinterStatus: TYPE ~ RECORD [ spooler: SpoolerStatus, formatter: FormatterStatus, printer: MarkingEngineStatus, media: Media ]; GetPrinterStatus: PROC [printer: ROPE] RETURNS [service: ROPE, answer: PrinterStatus]; <> StatusWatcherProc: TYPE ~ PROC [newStatus: PrinterStatus, clientData: REF, watcher: StatusWatcher]; <> RegisterStatusWatcher: PROC [printer: ROPE, update: StatusWatcherProc, clientData: REF ¬ NIL] RETURNS [watcher: StatusWatcher]; <> <<>> UnRegisterStatusWatcher: PROC [watcher: StatusWatcher]; <> <<>> <> <> <<>> <> <<>> <> <> <> <<>> Context: TYPE ~ REF ContextObject; ContextObject: TYPE ~ RECORD [ copyCount: CARD16 ¬ 1, mediumHint: AvailableKind ¬ NIL, -- "usLetter" message: ROPE ¬ NIL, pageFirst: CARD16 ¬ 0, pageLast: CARD16 ¬ LAST [CARD16], printerName: ROPE ¬ NIL, printObjectCreateDate: BasicTime.GMT ¬ BasicTime.nullGMT, printObjectName: ROPE ¬ NIL, printObjectSize: INT ¬ 0, priorityHint: ROPE ¬ NIL, recipientName: ROPE ¬ NIL, releaseKey: CARD16 ¬ 0, senderName: ROPE ¬ NIL, -- UserCredentials.Get[].name stapled: BOOL ¬ TRUE, telephone: ROPE ¬ NIL, twoSided: BOOL ¬ TRUE ]; GetDefaults: PROC [context: Context ¬ NIL] RETURNS [newContext: Context]; <> <<>> <> StatusChangedProc: TYPE ~ PROC [request: PrintRequest, clientData: REF]; <> PrintFromFile: PROC [file: ROPE, context: Context, update: StatusChangedProc ¬ NIL, clientData: REF ¬ NIL] RETURNS [request: PrintRequest]; <> PrintFromStream: PROC [s: IO.STREAM, context: Context, update: StatusChangedProc ¬ NIL, clientData: REF ¬ NIL] RETURNS [request: PrintRequest]; <> <<>> <> RequestStatus: TYPE ~ RECORD [ status: InterpressMasterStatus, statusMessage: ROPE ]; GetPrintRequestStatus: PROC [request: PrintRequest] RETURNS [status: RequestStatus]; <> RegisterPrintRequest: PROC [request: PrintRequest, update: StatusChangedProc, clientData: REF ¬ NIL]; <> <<>> UnRegisterPrintRequest: PROC [request: PrintRequest]; <> <> <> <<>> StatusWatcherList: TYPE ~ LIST OF StatusWatcher; StatusWatcher: TYPE ~ REF StatusWatcherObject; StatusWatcherObject: TYPE ~ RECORD [ clientData: REF, -- must be NIL'ed out during UnRegisterStatusWatcher[] lastStatus: PrinterStatus, update: StatusWatcherProc ]; WatcherListChanged: CONDITION; <> <<>> GetWatcherList: PROC RETURNS [list: PrintRequestList]; <> <<>> <> <<>> PrintRequestList: TYPE ~ LIST OF PrintRequest; PrintRequest: TYPE ~ REF PrintRequestObject; PrintRequestObject: TYPE ~ RECORD [ clientData: REF, -- must be NIL'ed out during UnRegisterPrintRequest[] context: Context, -- a copy of the ContextObject used to create this PrintRequestObject update: StatusChangedProc, distinguishedName: ROPE, requestID: Printing.RequestID, lastStatus: RequestStatus, attributes: Printing.PrintAttributes, options: Printing.PrintOptions, fileName: ROPE, ipMasterStream: IO.STREAM ]; RequestListChanged: CONDITION; <> <<>> GetPrintRequestList: PROC RETURNS [list: PrintRequestList]; <> CreateAvailableKind: PROC [s: Printing.KnownPaperSize] RETURNS [kind: AvailableKind]; CreateAvailableKindOther: PROC [size: PaperDimensions] RETURNS [kind: AvailableKind]; CreateMedium: PROC [s: AvailableKind] RETURNS [medium: Printing.Medium]; MungeMedia: PROC [s: Printing.Media] RETURNS [media: Media]; Insert: PROC [key: ROPE, medium: Printing.Medium, size: PaperDimensions]; CreateAttributes: PROC [context: Context] RETURNS [attributes: Printing.PrintAttributes]; CreateOptions: PROC [context: Context] RETURNS [options: Printing.PrintOptions]; CreatePrintRequest: PROC [context: Context, copyContext: BOOL ¬ TRUE] RETURNS [request: PrintRequest]; MungeProperties: PROC [s: Printing.PrinterProperties] RETURNS [properties: Properties]; MungePrinterStatus: PROC [s: Printing.PrinterStatus] RETURNS [printerstatus: PrinterStatus]; MungeRequestStatus: PROC [s: Printing.RequestStatus] RETURNS [requeststatus: RequestStatus]; }...