<> <> <> <> <> 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], IO USING [PutFR, PutRope, STREAM], PrintingP4V3 USING [GetPrinterStatus, PrinterStatus], PrintingP4V3Aux USING [ExposePrinterStatus], Process USING [CheckForAbort], Rope USING [Concat, Fetch, Length, ROPE], UserProfile USING [Token], XNS USING [Address]; GetPrintStatusImpl: CEDAR PROGRAM IMPORTS CHLookUp, Commander, CommandTool, CrRPC, IO, PrintingP4V3, PrintingP4V3Aux, Process, Rope, UserProfile ~ { <> BYTE: TYPE ~ Endian.BYTE; FWORD: TYPE ~ Endian.FWORD; Handle: TYPE ~ CrRPC.Handle; HWORD: TYPE ~ Endian.HWORD; PrinterStatus: TYPE ~ PrintingP4V3.PrinterStatus; ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; <> <<>> GetPrintStatus: ROPE = "///Commands/GetPrintStatus"; doc: ROPE = "{Printer}*\nFind out the status of an XNS based printer.\nSwitches: "; usage: ROPE = Rope.Concat["Usage: GetPrintStatus ", doc]; <> DecodeStatus: PROC [out: STREAM, status: PrinterStatus] ~ { msg: ROPE _ IO.PutFR["%g arguments seen.", [integer[1]] ]; msg _ Rope.Concat[PrintingP4V3Aux.ExposePrinterStatus[status, 0], "\n"]; IO.PutRope[out, msg]; }; GetPrinterStatus: PROC [destRope: ROPE] RETURNS [answer: PrinterStatus] ~ { addr: XNS.Address; h: Handle; service: CHNameP2V0.Name; [addr, service] _ CHLookUp.AddressFromRope[destRope]; h _ CrRPC.CreateClientHandle[class~$SPP, remote~addr]; answer _ PrintingP4V3.GetPrinterStatus[h]; CrRPC.DestroyClientHandle[h]; }; GetPrintStatusProc: 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: PrinterStatus; argsProcessed _ argsProcessed + 1; Process.CheckForAbort[]; <> <> <> status _ GetPrinterStatus[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["GetPrintStatus.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: GetPrintStatus, proc: GetPrintStatusProc, doc: doc, clientData: NIL, interpreted: TRUE]; }; Init[]; }...