DIRECTORY Buttons USING [ButtonProc, Create, Destroy], Commander USING [CommandProc, Register], Imager USING [black, MaskRectangle, SetColor, white], ImagerBackdoor USING [GetBounds], IO USING [card, PutFR, PutRope, rope, STREAM], PrintingP4V3 USING [RequestID], PrintingP4V3Aux USING [ExposeInterpressMasterStatus], Process USING [Detach], Rope USING [ROPE], TypeScript USING [Create], UserProfile USING [Boolean], ViewerClasses USING [AdjustProc, DestroyProc, PaintProc, Viewer, ViewerClass, ViewerClassRec], ViewerIO USING [CreateViewerStreams], ViewerOps USING [CreateViewer, EnumerateViewers, EnumProc, EstablishViewerPosition, OpenIcon, RegisterViewerClass], XNSPrint USING [GetPrintRequestList, GetPrintRequestStatus, RequestListChanged, PrintRequest, PrintRequestList, RequestStatus]; XNSPrintRequestWatcherImpl: CEDAR MONITOR IMPORTS Buttons, Commander, Imager, ImagerBackdoor, IO, PrintingP4V3Aux, Process, TypeScript, UserProfile, ViewerIO, ViewerOps, XNSPrint ~ { OPEN Printing: PrintingP4V3, PrintingAux: PrintingP4V3Aux, XNSPrint; XNSPrintRequestWatcher: ROPE ~ "XNSPrintRequestWatcher"; doc: ROPE ~ "\nCreate viewer to monitor and/or manipulate XNS print requests"; usage: ROPE ~ "Usage: XNSPrintRequestWatcher"; NAMESTRIPE: ROPE ~ "Print Request Manipulation"; TYPESCRIPT: ROPE ~ "/vux/tmp/XNSPrintRequestWatcher.log"; AUTOOPEN: ROPE ~ "HardcopyWatcher.AutoOpen"; pendingPrintRequests: PrintRequestList ฌ NIL; printManipViewerClass: ViewerClasses.ViewerClass; watcher: Data ฌ NIL; ButtonList: TYPE ~ LIST OF Viewer; ROPE: TYPE ~ Rope.ROPE; Viewer: TYPE ~ ViewerClasses.Viewer; Data: TYPE ~ REF DataRec; DataRec: TYPE ~ RECORD [ actualRequest: PrintRequest ฌ NIL, -- only for the ButtonProc autoOpen: BOOL ฌ FALSE, buttons: ButtonList ฌ NIL, requests: PrintRequestList ฌ NIL, typeScript: Viewer ฌ NIL, typeScriptIn: IO.STREAM ฌ NIL, typeScriptOut: IO.STREAM ฌ NIL, viewer: Viewer ฌ NIL ]; WaitTilListChanged: ENTRY PROC ~ { WAIT RequestListChanged; }; WatchRequestList: PROC ~ { enum: ViewerOps.EnumProc ~ { IF (v.class = printManipViewerClass) THEN UpdateViewer[NARROW [v.data]]; }; DO -- Forever WaitTilListChanged[]; ViewerOps.EnumerateViewers[enum]; ENDLOOP; -- Forever }; ClearWatcher: ENTRY PROC ~ { watcher ฌ NIL; }; ConditionallySetWatcher: ENTRY PROC [new: Data] RETURNS [old: Data] ~ { old ฌ watcher; IF (watcher = NIL) THEN watcher ฌ new; }; RequestWatcherCmd: Commander.CommandProc ~ { data: Data ฌ NEW [DataRec]; otherGuy: Data ฌ ConditionallySetWatcher[data]; IF (otherGuy # NIL) THEN { UpdateViewer[otherGuy, TRUE]; RETURN; }; data.autoOpen ฌ UserProfile.Boolean[AUTOOPEN, FALSE]; data.viewer ฌ ViewerOps.CreateViewer[ flavor: $XNSPrintRequestWatcher, info: [name: NAMESTRIPE, data: data] ]; data.typeScript ฌ TypeScript.Create[[parent: data.viewer, border: TRUE, wh: 60]]; [data.typeScriptIn, data.typeScriptOut] ฌ ViewerIO.CreateViewerStreams[NIL, data.typeScript, TYPESCRIPT]; TypeScriptWrite[data, "Beginning of Typescript...\n"]; UpdateViewer[data]; }; TypeScriptWrite: PUBLIC PROC [data: Data, rope: ROPE] ~ { IF (data.typeScriptOut # NIL) THEN IO.PutRope[data.typeScriptOut, rope]; }; AdjustProc: ViewerClasses.AdjustProc ~ { data: Data ฌ NARROW [self.data]; nButtons: NAT ฌ 0; height: INTEGER ฌ self.wh-12; FOR buttons: ButtonList ฌ data.buttons, buttons.rest WHILE (buttons # NIL) DO button: Viewer ฌ buttons.first; nButtons ฌ nButtons+1; ViewerOps.EstablishViewerPosition[button, 0, (height-(20*nButtons)), button.ww, button.wh]; ENDLOOP; ViewerOps.EstablishViewerPosition[data.typeScript, 0, 0, self.ww, (height-(20*nButtons)-4)]; RETURN[TRUE]; }; DestroyProc: ViewerClasses.DestroyProc ~ { data: Data ฌ NARROW [self.data]; ClearWatcher[]; }; PaintProc: ViewerClasses.PaintProc = { data: Data ฌ NARROW [self.data]; IF (whatChanged = NIL) THEN { Imager.SetColor[context, Imager.white]; Imager.MaskRectangle[context, ImagerBackdoor.GetBounds[context]]; Imager.SetColor[context, Imager.black]; }; }; UpdateViewer: PROC [data: Data, forceOpen: BOOL ฌ FALSE] ~ { data.requests ฌ GetPrintRequestList[]; MakeButtons[data]; IF ( (data.autoOpen) OR (forceOpen) ) THEN { IF (data.viewer.iconic) THEN ViewerOps.OpenIcon[data.viewer]; }; }; ButtonProc: Buttons.ButtonProc ~ { data: Data ฌ NARROW [clientData]; msg: ROPE ฌ NIL; request: PrintRequest ฌ data.actualRequest; requestStatus: RequestStatus; TypeScriptWrite[data, "Checking: "]; TypeScriptWrite[data, data.actualRequest.fileName]; TypeScriptWrite[data, "\n"]; requestStatus ฌ XNSPrint.GetPrintRequestStatus[request]; msg ฌ PrintingAux.ExposeInterpressMasterStatus[requestStatus.status, 1]; TypeScriptWrite[data, "status: ("]; TypeScriptWrite[data, msg]; TypeScriptWrite[data, ") statusMessage: "]; TypeScriptWrite[data, requestStatus.statusMessage]; TypeScriptWrite[data, "\n"]; }; MakeButtons: PROC [data: Data] ~ { FOR buttons: ButtonList ฌ data.buttons, buttons.rest WHILE (buttons # NIL) DO Buttons.Destroy[buttons.first]; ENDLOOP; data.buttons ฌ NIL; FOR pr: PrintRequestList ฌ data.requests, pr.rest WHILE (pr # NIL) DO MakeButton[pr.first, data]; ENDLOOP; [] ฌ AdjustProc[data.viewer]; }; MakeButton: PROC [request: PrintRequest, data: Data] ~ { buttonName: ROPE ฌ NIL; id: ROPE ฌ NIL; IF (request = NIL) THEN RETURN; FOR n: NAT IN [0..5) DO id ฌ IO.PutFR["%g %g", IO.rope[id], IO.card[request.requestID[n]]]; ENDLOOP; buttonName ฌ IO.PutFR["%g %g %g", IO.rope[request.context.printerName], IO.rope[id], IO.rope[request.fileName]]; data.actualRequest ฌ request; data.buttons ฌ CONS[ Buttons.Create[ info: [parent: data.viewer, name: buttonName], proc: ButtonProc, clientData: data ], data.buttons ]; }; Init: PROC ~ { printManipViewerClass ฌ NEW[ViewerClasses.ViewerClassRec ฌ [ paint: PaintProc, adjust: AdjustProc, destroy: DestroyProc ]]; ViewerOps.RegisterViewerClass[$XNSPrintRequestWatcher, printManipViewerClass]; Commander.Register[XNSPrintRequestWatcher, RequestWatcherCmd, doc]; TRUSTED {Process.Detach[ FORK WatchRequestList]}; }; Init[]; }... า XNSPrintRequestWatcherImpl.mesa Copyright ำ 1985, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, October 29, 1986 10:03:43 pm PST Bill Jackson (bj) February 6, 1987 5:39:11 am PST Tim Diebert: February 9, 1987 11:00:03 am PST Michael Plass, October 9, 1991 12:37 pm PDT Commander Constants UserProfile Tags Global State Types Display update Procs Procs guarding "watcher" state Commander Proc Viewer Procs Button Procs Initialization ส ึ•NewlineDelimiter –(cedarcode) style™codešœ™Kšœ ฯeœ6™BKšœ*ฯk™-Kšœ1™1K™-K™+K™—šž ˜ Kšœžœ˜,Kšœ žœ˜(Kšœžœ)˜5Kšœžœ ˜!Kšžœžœžœ˜.Kšœ žœ ˜Kšœžœ ˜5Kšœžœ ˜Kšœžœžœ˜Kšœ žœ ˜Kšœ žœ ˜KšœžœK˜^Kšœ žœ˜%Kšœ žœd˜sKšœ žœq˜—K˜šะlnœžœž˜)Kšžœ-žœV˜ŒKšžœฯnœ  œ˜D—K˜šœ™K˜Kš œžœ˜8KšฯbœžœE˜NKšกœžœ#˜.K˜Kšะbk œžœ ˜0Kšข œžœ)˜9K™—šœ™K˜Kšขœžœกœ˜,K™—™ K™Kšœ)žœ˜-Kšœ1˜1Kšœžœ˜K˜—™K™Kšœ žœžœžœ˜"Kšžœžœžœ˜šœžœ˜$K˜—Kšœžœžœ ˜šœ žœžœ˜Kšœžœฯc˜=Kšœ žœžœ˜Kšœžœ˜Kšœžœ˜!Kšœžœ˜Kšœžœžœžœ˜Kšœžœžœžœ˜Kšœž˜K˜—K˜—™K˜š œžœžœ˜"Kšžœ˜Kšœ˜K˜—š œžœ˜šœ˜Kšžœ#žœžœ ˜HK˜—šžœฃ ˜Kšœ˜Kšœ!˜!Kšžœฃ ˜—Kšœ˜—K™—™K˜š  œžœžœ˜Kšœ žœ˜Kšœ˜K˜—š œžœžœ žœ˜GK˜Kšžœ žœžœ˜&Kšœ˜—K˜—™K™šะbn œ˜,Kšœ žœ ˜K˜/K˜šžœ žœžœ˜Kšœžœ˜Kšžœ˜Kšœ˜—K˜Kšœ$ขœžœ˜5K˜•StartOfExpansionฟ[flavor: ViewerClasses.ViewerFlavor, info: ViewerClasses.ViewerRec _ [class: NIL, wx: 0, wy: 0, ww: 0, wh: 0, cx: 0, cy: 0, cw: 0, ch: 0, lock: [process: PROCESS#0B, count: 0B (0)], tipTable: NIL, name: NIL, file: NIL, label: NIL, menu: NIL, icon: 177777B?, column: left, caption: FALSE, scrollable: TRUE, hscrollable: FALSE, iconic: TRUE, border: TRUE, newVersion: FALSE, newFile: FALSE, visible: TRUE, offDeskTop: FALSE, destroyed: FALSE, init: FALSE, saveInProgress: FALSE, inhibitDestroy: FALSE, guardDestroy: FALSE, paintingWedged: FALSE, ...], paint: BOOL _ TRUE]˜%Kšœ ˜ Kšœ ข œ ˜$Kšœ˜K˜—KšœBžœ ˜QKšœGžœข œ˜iK˜K˜6Kšœ˜K˜—K˜—™ K™š œžœžœžœ˜9Kšžœžœžœžœ#˜HK˜K˜—šค œ˜(Kšœ žœ ˜ Kšœ žœ˜Kšœžœ˜šžœ2žœ žœž˜MK˜K˜Kšœ[˜[Kšžœ˜—Kšœ\˜\Kšžœžœ˜ K˜K˜—šค œ˜*Kšœ žœ ˜ Kšœ˜Kšœ˜K˜—–y -- [self: ViewerClasses.Viewer, context: Imager.Context, whatChanged: REF ANY, clear: BOOL] RETURNS [quit: BOOL _ FALSE]š  œ˜&Kšœ žœ ˜ K˜šžœžœžœ˜Kšœ'˜'KšœA˜AKšœ'˜'K˜—K˜K˜—š  œžœžœžœ˜