-- NSPrintAgentImpl.mesa
-- Copyright (C) 1985 by Xerox Corporation. All rights reserved.
-- Bill Jackson, June 23, 1985 2:22:53 am PDT
DIRECTORY
CedarNSPrintRpcControl,
CedarNSPrintUtilsRpcControl,
NSPrint,
CedarNSPrint,
CedarNSPrintUtils,
AddressTranslation USING [Error, PrintError, StringToNetworkAddress],
Filer USING [File],
Format USING [StringProc],
MStream USING [Copy, Error, Handle, ReadOnly],
NSDataStream USING [Aborted, SinkStream],
Stream USING [Delete, SetPosition];
NSPrintAgentImpl: MONITOR
IMPORTS
NSPrint, CedarNSPrintRpcControl, CedarNSPrintUtilsRpcControl,
AddressTranslation, Filer, MStream, NSDataStream, Stream
EXPORTS CedarNSPrint, CedarNSPrintUtils =
BEGIN OPEN CedarNSPrint, CedarNSPrintUtils;
-- This should be much more careful than this!
error: PROCEDURE [x: NSPrint.ErrorRecord]
RETURNS [y: CedarNSPrint.ErrorRecord] = {
RETURN[LOOPHOLE[x, CedarNSPrint.ErrorRecord]]; };
pa: PROCEDURE [x: PrintAttributes] RETURNS [y: NSPrint.PrintAttributes] = {
RETURN[LOOPHOLE[x, NSPrint.PrintAttributes]]; };
po: PROCEDURE [x: PrintOptions] RETURNS [y: NSPrint.PrintOptions] = {
RETURN[LOOPHOLE[x, NSPrint.PrintOptions]]; };
se: PROCEDURE [x: SystemElement] RETURNS [y: NSPrint.SystemElement] = {
RETURN[LOOPHOLE[x, NSPrint.SystemElement]]; };
cse: PROCEDURE [x: NSPrint.SystemElement] RETURNS [y: SystemElement] = {
RETURN[LOOPHOLE[x, SystemElement]]; };
rid: PROCEDURE [x: RequestID] RETURNS [y: NSPrint.RequestID] = {
RETURN[LOOPHOLE[x, NSPrint.RequestID]]; };
crid: PROCEDURE [x: NSPrint.RequestID] RETURNS [y: CedarNSPrint.RequestID] = {
RETURN[LOOPHOLE[x, CedarNSPrint.RequestID]]; };
pp: PROCEDURE [x: NSPrint.PrinterProperties]
RETURNS [y: CedarNSPrint.PrinterProperties] = {
RETURN[LOOPHOLE[x, CedarNSPrint.PrinterProperties]]; };
ps: PROCEDURE [x: NSPrint.PrinterStatus]
RETURNS [y: CedarNSPrint.PrinterStatus] = {
RETURN[LOOPHOLE[x, CedarNSPrint.PrinterStatus]]; };
rs: PROCEDURE [x: NSPrint.RequestStatus]
RETURNS [y: CedarNSPrintUtils.RequestStatus] = {
RETURN[LOOPHOLE[x, CedarNSPrint.RequestStatus]]; };
Error: PUBLIC ERROR [why: ErrorRecord] = CODE;
Print: PUBLIC PROCEDURE [
master: Source, printAttributes: PrintAttributes,
printOptions: PrintOptions, systemElement: SystemElement]
RETURNS [printRequestID: RequestID] = {
localStream: MStream.Handle;
foo: NSPrint.RequestID;
basename: LONG STRING = "$PrintAgent.tmp$";
SendStream: PROCEDURE [sink: NSDataStream.SinkStream] = {
[] ← MStream.Copy[
from: localStream, to: sink, bytes: LAST[LONG CARDINAL] !
NSDataStream.Aborted => CONTINUE;
UNWIND => Stream.Delete[sink ! NSDataStream.Aborted => CONTINUE]];
Stream.Delete[sink ! NSDataStream.Aborted => CONTINUE]};
-- Here is where we have to FTP over the file from Cedar STPServer
-- and open an appropriate stream (NSStream) on the local file
Filer.File[from: master, to: basename];
localStream ← MStream.ReadOnly[
name: basename, release: [NIL, NIL] ! MStream.Error => {NULL}];
foo ← NSPrint.Print[
[proc[SendStream]], pa[printAttributes], po[printOptions], se[
systemElement] !
NSPrint.Error =>
SELECT why.errorType FROM
busy, tooManyClients => {
Error[error[why]]; Stream.SetPosition[localStream, 0]; RETRY};
spoolingDisabled => {
Error[error[why]]; Stream.SetPosition[localStream, 0]; RETRY};
ENDCASE => {Error[error[why]]}];
RETURN[crid[foo]];
};
GetPrinterProperties: PUBLIC PROCEDURE [systemElement: SystemElement]
RETURNS [properties: PrinterProperties] = {
RETURN[pp[NSPrint.GetPrinterProperties[se[systemElement]]]]; };
GetPrinterStatus: PUBLIC PROCEDURE [systemElement: SystemElement]
RETURNS [status: PrinterStatus] = {
RETURN[ps[NSPrint.GetPrinterStatus[se[systemElement]]]]; };
GetPrintRequestStatus: PUBLIC PROCEDURE [
printRequestID: RequestID, systemElement: SystemElement]
RETURNS [status: RequestStatus] = {
RETURN[
rs[
NSPrint.GetPrintRequestStatus[rid[printRequestID], se[systemElement]]]];
};
AddressTranslationStringToNetworkAddress: PUBLIC PROCEDURE [name: LONG STRING]
RETURNS [systemElement: SystemElement, chUsed: BOOLEAN] = {
element: NSPrint.SystemElement;
cacheMiss: BOOLEAN;
errorString: LONG STRING ← [128];
stringProc: Format.StringProc = {errorString ← s};
[element, cacheMiss] ← AddressTranslation.StringToNetworkAddress[
name !
AddressTranslation.Error => {
AddressTranslation.PrintError[errorRecord, stringProc]}];
RETURN[cse[element], cacheMiss];
};
FreeString: PUBLIC PROCEDURE [string: LONG POINTER] = {
NSPrint.FreeString[string]; };
FreeMedia: PUBLIC PROCEDURE [media: LONG POINTER] = {
NSPrint.FreeMedia[media]; };
FreePrinterProperties: PUBLIC PROCEDURE [printerProperties: LONG POINTER] = {
NSPrint.FreePrinterProperties[printerProperties]; };
FreePrinterStatus: PUBLIC PROCEDURE [printerStatus: LONG POINTER] = {
NSPrint.FreePrinterStatus[printerStatus]; };
FreeRequestStatus: PUBLIC PROCEDURE [requestStatus: LONG POINTER] = {
NSPrint.FreeRequestStatus[requestStatus]; };
Init: PROCEDURE = {
CedarNSPrintRpcControl.ExportInterface[user: NIL, password: TRASH];
CedarNSPrintUtilsRpcControl.ExportInterface[user: NIL, password: TRASH];
};
Init[];
END. .. -- NSPrintAgentImpl.