XNSPrintingUIDoc.tioga
Copyright Ó 1986, 1987, 1989, 1991, 1993 by Xerox Corporation. All rights reserved.
Bill Jackson (bj) February 24, 1987 8:12:37 pm PST
Tim Diebert: February 6, 1987 4:44:45 pm PST
Rick Beach, November 28, 1987 1:34:42 pm PST
gbb February 15, 1989 6:23:09 pm PST
Michael Plass, June 2, 1993 3:48 pm PDT
XNSPRINTINGUI
CEDAR 10.0 FOR INTERNAL XEROX USE ONLY
XNSPrintingUI
Commands for using an XNS Print Service
Bill Jackson
© Copyright 1986, 1987, 1991 Xerox Corporation. All rights reserved.
Abstract: XNSPrintingUI supplies a user interface and a client interface to procedures exported by the Printing Courier Program which is available on product printer servers (8044's, 8045's, 4050's) and on the Cedar Interpress print server. The Commander Operations of SendIPMaster, GetPrintStatus, GetPrintProperties, and XNSPrintRequestWatcher are supported. I've added the manipulative interface XNSPrintRequestWatcher which allows one to check on the progress of a print request; it's just a little too hard for users to type a multi word Opaque data type at the commander, and I'd rather not invent a heuristic (since my creativity is pretty drained right now).
Created by: Bill Jackson (with credits to Jules Bloomenthal)
Maintained by: Bill Jackson <BJackson>
Keywords: Courier, fonts, Interpress, network tools, printing, Sirocco, Tioga documents, XNS
XEROX  Xerox Corporation
   Palo Alto Research Center
   3333 Coyote Hill Road
   Palo Alto, California 94304

For Internal Xerox Use Only
1. Context
Scope of the package
XNSPrintingUI is a transport mechanism which will deliver a document to a printer. Appearance of the finished product is totally dependent upon the actions of the printer with respect to the instructions supplied in the Interpress master. This document touches on some other topics, such as where printers are and example of creating Interpress masters, but for a more complete description the "truth" lies elsewhere. Hopefully there is enough here to get started, or to stimulate your memory.
2. UserProfile
Recommendations
The user profile entries Hardcopy.InterpressPrinter, Hardcopy.TwoSided, and Hardcopy.PigeonHole are recommended. In particular, it is quite helpful to define your standard Interpress printer, as all commands take advantage of the default value of this option. Most of the other values have been included for completeness, but it is clearly much easier to use command line options to alter their values for particular print requests.
CommandTool.NewUser (or BootCommands)
Alias QPrint (File) TiogaToInterpress File.IP$ ← File; SendIPMaster -h Snoball File.IP$; Delete File.IP$
CommandTool.PerLogin
CreateButton Print Print $FileNameSelection$
HardCopy options
BANNER: ROPE ~  "Hardcopy.Banner";    -- ""
COPYCOUNT: ROPE ~ "Hardcopy.CopyCount";   -- 1
FAX: ROPE ~   "Hardcopy.FaxPhoneNumber"; -- ""
IPPRINTER: ROPE ~ "Hardcopy.InterpressPrinter"; -- "Huh? -- no printer!"
KEY: ROPE ~   "Hardcopy.Key";     -- 0
MEDIUM: ROPE ~  "Hardcopy.Medium";    -- "usLetter"
PIGEONHOLE: ROPE ~ "Hardcopy.PigeonHole";   -- senderName
PAGEFIRST: ROPE ~ "Hardcopy.PageFirst";   -- 1
PAGELAST: ROPE ~  "Hardcopy.PageLast";   -- 177777B (max)
PRIORITY: ROPE ~  "Hardcopy.Priority";    -- "normal"
STAPLED: ROPE ~  "Hardcopy.Stapled";    -- FALSE
TWOSIDED: ROPE ~ "Hardcopy.TwoSided";   -- TRUE
AUTOOPEN: ROPE ~ "HardcopyWatcher.AutoOpen";-- FALSE
Be sure to quote the name of the printer option on Hardcopy.InterpressPrinter entry.
The two "BOOLEAN" options, Hardcopy.Stapled and Hardcopy.TwoSided, deserve some special explanation. It is possible to use instructions inside the Interpress master that will specify these things, but if a TRUE or FALSE value is passed over the protocol, that takes precedence over the master's instructions. This can be awkward, especially because it is possible to say certain things (such as tumbleDuplex) in the master that cannot be expressed in the protocol. To allow for this possibility, you can say
Hardcopy.TwoSided: Default
Hardcopy.Stapled: Default
in your profile to omit these things from the protocol altogether, leaving it to the printer and the master's instructions to specify them. If you have the Hardcopy.TwoSided option set to TRUE or FALSE, and you want to override this on the command line of SendIPMaster, you may alternatively use the "-0" switch.
3. Introduction to Printing on product servers
Printer types and locations
N. B. This information is quite dated; do not depend on it to be very accurate.
Perfector
[Perfector:Parc:Xerox] is a RoadRunner printer at PARC, located in the pod 3 maze. Perfector prints Interpress 3.1 (and other PDLs) on a 4090 print engine, which is a duplex printer (prints two-sided pages) that prints at up to 90 pages per minute.
Snoball
[Snoball:Parc:Xerox] is a RoadRunner printer at PARC, located in the pod 3 maze. Snoball prints Interpress 3.1 (and other PDLs) on a 4850 print engine, which is a duplex (prints two-sided pages), highlight color printer, with a stapler, that prints at up to 50 pages per minute.
Cedar Print Servers
PARC has installed several Interpress 3.0 Professional Graphics Set print servers based on the Cedar Imager and Interpress implementations. These printers will print any Interpress master generated by Cedar, ViewPoint, XDE or Interpress ToolKit applications (subject to resource limitations on the Dandelion processor, mainly virtual memory limits). Here is a list of printers near CSL.
Service Name Location
[TimsPrinter:Parc:Xerox] Bld 35 # Tim's annex -- an experimental system
8044's & 8045's
804x's were the most prevalent Interpress printers around PARC. You can find them listed under NS PRINTERS in [Indigo]<Registrar>ParcPhoneList.txt; here are a few near CSL:
Service Name Location
[Scripto:Parc:Xerox] Bld 35 # 2106 -- with Clover/Quoth
[Papermate:Parc:Xerox] Bld 35 # 3307 -- with Wonder
Some of these have Raven (2700) print engines attached and others have Banhsee (4045) engines. This should make no difference other than speed/paper capacity/blackness. The key is what version of software is on the server.
Also, there are fonts to be found just about anywhere, but there is a set of "Required Fonts" that you can normally expect to find. The software folks have the complete rundown of what is in the "Required Fonts" set, and what extra fonts have been installed on each printer.
Interpress Master Creation
Tioga documents
Well, there's a lot more about creating Interpress masters than I can hope to cover here, but here's a simple example. For more information look at TiogaImagerDoc.tioga, or contact the folks in the Imaging Group. (Caution: InterpressToCompressedIP takes a while even on a Dorado and consumes substantial disk space.)
% TiogaToInterpress XNSPrintingUIDoc.tioga
Reading []<>Users>Beach.pa>7.0>XNSPrintingUI>XNSPrintingUIDoc.tioga!2 . . . [1] [2] [3] [4] [5] [6] [7]
[]<>Users>Beach.pa>7.0>XNSPrintingUI>XNSPrintingUIDoc.interpress!2 written.
% InterpressToCompressedIP XNSPrintingUIDoc-4050.interpress ← XNSPrintingUIDoc.interpress
Reading []<>Users>Beach.pa>7.0>XNSPrintingUI>XNSPrintingUIDoc.interpress!2 . . . [1] [2] [3] [4] [5] [6] [7] []<>Users>Beach.pa>7.0>XNSPrintingUI>XNSPrintingUIDoc-4050.interpress!1 written.
% SendIPMaster -h Zipper XNSPrintingUIDoc-4050.interpress
Sending [ShangriLa]<Cedar>Users>Beach.pa>7.0>XNSPrintingUI>XNSPrintingUIDoc-4050.interpress to Zipper
Service: [Warning Appearance Errors:PARC:xerox]
RequestID: [39722, 52311, 0, 43571, 1428]
Slides
Slides are a little unique, as you want to start with the specialized form in order to have available to you some of the characters which are only available on the Interpress printers (press has a smaller character set).
% Form BitsOnPaper.tioga ← AnacapaSlides
% TiogaToInterpress BitsOnPaper.tioga
Reading []<>Temp>BitsOnPaper.tioga!6 . . . [1] [2] [3]
[]<>Temp>BitsOnPaper.interpress!9 written.
% SendIPMaster -h Perfector BitsOnPaper.interpress
Sending [Oriskany]<Cedar>Temp>BitsOnPaper.interpress to Perfector
Service: [Perfector:Parc:Xerox]
RequestID: [0, 43520, 29765, 5478, 9077]
4. Introduction to the User Interface for XNS Printing
Commander operations
SendIPMaster
A quick synopsis: SendIPMaster transmits an Interpress master to a print service (a piece of software). In actuality, nothing checks to see if the contents of the file is an actual master, so this is actually a slight deception. Furthermore, SendIPMaster knows nothing about Interpress, nothing about the imaging software on the print service side, nor what the intended appearance of the "file" actually is. The job of SendIPMaster is simply to deliver (reliably) the contents of the file in question to the printer. In order to understand what the printer is going to do with this master, you need to look at the print service documentation. It would be wonderful if everything simply printing Interpress 3.0!
% ? SendIPMaster
SendIPMaster <IPMaster> [-0 -1 -2 -a -b -s -c <copies> -h <serviceName> -f <firstPageNumber> -l <lastPageNumber> -m <message> -medium <medium>]
Transmit a master to an XNS based printer.
Switches:
-0 leave plex unspecified
-1 print one-sided
-2 print two-sided
-a correct color (Lamming-Rhodes; includes -b)
-b balance grays
-s staple output
-c <copies> print multiple copies
-f <firstPageNumber>
-h <serviceName> print on that service
-l <lastPageNumber> -m <message> include parameter (possibly quoted) in printer message field
-medium <medium> paper size, e.g., -medium usLetter or -medium ([width~229, length~279])
% SendIPMaster -h Perfector -medium usLetter Log.ip
Sending Log.ip to Perfector
Service: [Perfector:PARC:Xerox]
RequestID: [8564, 147, 0, 956, 21760]
The specification of -medium is really a string, and so gets a little weird for things not in the standard list of names. Examples using two Commander quoting conventions are
-medium ([width~279, length~432])
-medium "[width~279, length~432]"
but
-medium ([width~279, length~432])
will not work because of the extra space. Strange, but true. The sizes are millimeters, so this is example selects 11 by 17 inch paper. Use GetPrintProperties (see below) to find out the legal choices for your printer.
FaxIPMaster
A quick synopsis: FaxIPMaster transmits an Interpress master to a print service (a piece of software) identically to the way SendIPMaster does, but the "message" field of the protocol is filled in with an encoding of the destination phone number of the remote Fax machine, so when the document is "printed" it is actually sent over telephone lines to a fax machine somewhere out there in the *real* world.
Some notes on acceptable formats of phone numbers are in order here, but for now, the software is stupid. Suffice it to say, strings of digits work, assume anything else doesn't.
% ? FaxIPMaster
FaxIPMaster <IPMaster> [-t <telephone number> -c <copies> -h <serviceName> -0 -1 -2 -f <firstPageNumber> -l <lastPageNumber>]
Send a master through an XNS based server to a remote FAX machine.
Switches:
-t <telephone number> FAX phone number
-c <copies> print multiple copies
-h <serviceName> print thru service
-0 leave plex unspecified
-1 print one-sided
-2 print two-sided
-f <firstPageNumber>
-l <lastPageNumber>
% FaxIPMaster -h "Universal FAX:Osbu North" -t "9(415)4944241" Log.ip
Sending [Oriskany]<Cedar>Users>BJackson.pa>7.0>Printing>Log.ip to Universal FAX:Osbu North
Service: [Universal Fax:OSBU North:Xerox]
RequestID: [0, 43520, 9404, 27290, 9092]
GetPrintStatus
A quick synopsis: GetPrintStatus queries the print service to determine the present state. There are 4 interesting aspects: spooler, formatter, printer, and media. Spooler status explains the current state of the ability of ther print service to accept print requests, formatter status explains the current state of the Interpress master decomposition software, printer status explains the current state of the marking engine, and media status explains the currently available materials upon which masters can be rendered.
% ? GetPrintStatus
GetPrintStatus {Printer}*
Find out the status of an XNS based printer.
{implementor: ^GetPrintStatusImpl.GetPrintStatusProc}
% GetPrintStatus Quill
Service: [Quill:PARC:Xerox]
Spooler: available, Formatter: available, Printer: available
Media: [ [Medium(paper): Paper(knownSize): usLetter], [Medium(paper): Paper(knownSize): usLegal] ]
GetPrintProperties
A quick synopsis: GetPrintProperties queries the print service to determine the present abilites of the printer. There are 3 interesting properties: media, staple, and twoSided. Media properties describe the currently available materials upon which masters can be rendered, staple & twoSided describe the availablity of the stapling and duplex printing services.

%
? GetPrintProperties
GetPrintProperties {Printer}*
Find out the properties of an XNS based printer.

% GetPrintProperties Perfector
Service: [Perfector:PARC:Xerox]
Staple: FALSE, TwoSided: TRUE
Media: [ [usLetter] ]
% GetPrintProperties IPPaper
Service: [InternationalPulpAndPaper:PARC:Xerox]
Staple: TRUE, TwoSided: TRUE
Media: [ [[width~230, length~279]], [[width~279, length~432]], [usLegal], [usLetter] ]
%
XNSPrintRequestWatcher
A quick synopsis: XNSPrintRequestWatcher provides the ability to create/open a manipulative interface for dealing with active print requests (documents previously transmitted to print services). More below...
% ? XNSPrintRequestWatcher
XNSPrintRequestWatcher
Create viewer to monitor and/or manipulate XNS print requests
{implementor: ^XNSPrintRequestWatcher.RequestWatcherCmd}
% XNSPrintRequestWatcher
% (either creates a viewer or opens an existing viewer)
XNSPrintRequestWatcher
Button poking
A quick synopsis: Currently, there are some bugs, and the functionality should be inhanced, but poking on the button which corresponds to a print request will query the service and display the print requests' current state. Buttons currently include <service, request id, filename>; the interesting part of a request id is the 4th word 4 which seems to be a sequentially assigned value on Services 10.0 printers. Display is via a typescript which gets logged on the file ///Temp/XNSPrintRequestWatcher.TypeScript
poke a button => a log entry
Beginning of Typescript...
Checking: [Oriskany]<Cedar>Users>BJackson.pa>PrintUI>Log.ip
RequestStatus: [
(0) JobStatus(status): completed
(1) JobStatus(statusMessage): ""]