DIRECTORY CHNameP2V0 USING [Name], CHLookUp USING [AddressFromRope], Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, Failed, Parse], CrRPC USING [CreateClientHandle, DestroyClientHandle, Handle], Endian USING [BYTE, FWORD, HWORD], PrintingP4V3 USING [GetPrinterProperties, PrinterProperties], PrintingP4V3Aux USING [ExposePrinterProperties], IO USING [PutFR, PutRope, STREAM], Process USING [CheckForAbort], Rope USING [Concat, Fetch, Length, ROPE], UserProfile USING [Token], XNS USING [Address]; GetPrintPropertiesImpl: CEDAR PROGRAM IMPORTS CHLookUp, CrRPC, Commander, CommandTool, IO, PrintingP4V3, PrintingP4V3Aux, Process, Rope, UserProfile ~ { BYTE: TYPE ~ Endian.BYTE; FWORD: TYPE ~ Endian.FWORD; Handle: TYPE ~ CrRPC.Handle; HWORD: TYPE ~ Endian.HWORD; ROPE: TYPE = Rope.ROPE; PrinterProperties: TYPE ~ PrintingP4V3.PrinterProperties; STREAM: TYPE = IO.STREAM; GetPrintProperties: ROPE = "///Commands/GetPrintProperties"; doc: ROPE = "{Printer}*\nFind out the properties of an XNS based printer.\nSwitches: "; usage: ROPE = Rope.Concat["Usage: GetPrintProperties ", doc]; DecodeStatus: PROC [out: STREAM, status: PrinterProperties] ~ { msg: ROPE _ IO.PutFR["%g arguments seen.", [integer[1]] ]; msg _ Rope.Concat[PrintingP4V3Aux.ExposePrinterProperties[status, 0], "\n"]; IO.PutRope[out, msg]; }; GetPrinterProperties: PROC [destRope: ROPE] RETURNS [answer: PrinterProperties] ~ { addr: XNS.Address; h: Handle; service: CHNameP2V0.Name; [addr, service] _ CHLookUp.AddressFromRope[destRope]; h _ CrRPC.CreateClientHandle[class~$SPP, remote~addr]; answer _ PrintingP4V3.GetPrinterProperties[h]; CrRPC.DestroyClientHandle[h]; }; GetPrintPropertiesProc: Commander.CommandProc ~ { out: STREAM ~ cmd.out; switches: PACKED ARRAY CHAR['a..'z] OF BOOL _ ALL[FALSE]; ProcessSwitches: PROC [arg: ROPE] ~ { sense: BOOL _ TRUE; FOR index: INT IN [0..Rope.Length[arg]) DO char: CHAR _ Rope.Fetch[arg, index]; SELECT char FROM '- => LOOP; '~ => {sense _ NOT sense; LOOP}; IN ['a..'z] => switches[char] _ sense; IN ['A..'Z] => switches[char + ('a-'A)] _ sense; ENDCASE; sense _ TRUE; ENDLOOP; }; ProcessArgument: PROC [arg: ROPE] ~ { status: PrinterProperties; argsProcessed _ argsProcessed + 1; Process.CheckForAbort[]; status _ GetPrinterProperties[arg]; DecodeStatus[out, status]; }; argsProcessed: NAT _ 0; argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd: cmd, starExpand: FALSE ! CommandTool.Failed => {msg _ errorMsg; GO TO failed}]; ProcessSwitches[UserProfile.Token["GetPrintProperties.DefaultSwitches"]]; FOR i: NAT IN [1..argv.argc) DO arg: ROPE ~ argv[i]; Process.CheckForAbort[]; IF (Rope.Length[arg] = 0) THEN LOOP; IF (Rope.Fetch[arg, 0] = '-) THEN { ProcessSwitches[arg]; LOOP; }; ProcessArgument[arg]; ENDLOOP; SELECT argsProcessed FROM 0 => { msg _ usage }; ENDCASE => { NULL }; EXITS failed => {result _ $Failure}; }; Init: PROC ~ { Commander.Register[key: GetPrintProperties, proc: GetPrintPropertiesProc, doc: doc, clientData: NIL, interpreted: TRUE]; }; Init[]; }... dGetPrintPropertiesImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Russ Atkinson, April 2, 1985 4:22:08 pm PST Bill Jackson (bj) October 9, 1986 5:49:50 am PDT Demers, June 6, 1986 3:09:39 pm PDT Copied Types Constants Procs To process an argument, get the status from the printer, and generate some sensible textual output. Κ˜codešœ™Kšœ Οmœ1™Kš œžœžœžœžœ˜"Kšœ žœ+˜=Kšœžœž˜0Kšžœžœžœ˜"Kšœžœ˜Kšœžœžœ˜)Kšœ žœ ˜Kšžœžœ ˜—K˜šΟnœžœž˜%Kšžœ*žœ?˜r—K˜™ K™Kšžœžœ žœ˜Kšžœžœ žœ˜Kšœžœ˜Kšžœžœ žœ˜Kšžœžœžœ˜Kšœžœ"˜9Kšžœžœžœžœ˜K˜—™ K™KšŸœžœ$˜