<body>
<div class='body'>
<!--
- "$Id: api-filter.header 7285 2008-02-01 23:57:39Z mike $"
+ "$Id: api-filter.header 7616 2008-05-28 00:34:13Z mike $"
Filter and backend programming header for the Common UNIX Printing System
(CUPS).
<tr>
<th>Headers</th>
<th>cups/backend.h<br>
- cups/sidechannel.h<br>
- cups/snmp.h</th>
+ cups/sidechannel.h</th>
</tr>
</thead>
<tbody>
<td>Programming: <a href='api-overview.html' target='_top'>Introduction to CUPS Programming</a><br>
Programming: <a href='api-cups.html' target='_top'>CUPS API</a><br>
Programming: <a href='api-ppd.html' target='_top'>PPD API</a><br>
- Programming: <a href='api-raster.html' target='_top'>Raster API</a></td>
+ Programming: <a href='api-raster.html' target='_top'>Raster API</a><br>
+ Specifications: <a href='spec-design' target='_top'>CUPS Design Description</a></td>
</tr>
</tbody>
</table></div>
</ul></li>
<li><a href="#ENUMERATIONS">Constants</a><ul class="code">
<li><a href="#cups_backend_e" title="Backend exit codes">cups_backend_e</a></li>
- <li><a href="#cups_sc_bidi_e" title="Bidirectional capabilities">cups_sc_bidi_e</a></li>
+ <li><a href="#cups_sc_bidi_e" title="Bidirectional capability values">cups_sc_bidi_e</a></li>
<li><a href="#cups_sc_command_e" title="Request command codes">cups_sc_command_e</a></li>
<li><a href="#cups_sc_state_e" title="Printer state bits">cups_sc_state_e</a></li>
<li><a href="#cups_sc_status_e" title="Response status codes">cups_sc_status_e</a></li>
</ul></li>
</ul>
<!--
- "$Id: api-filter.shtml 7502 2008-04-28 21:30:12Z mike $"
+ "$Id: api-filter.shtml 7677 2008-06-19 23:22:19Z mike $"
Filter and backend programming introduction for the Common UNIX Printing
System (CUPS).
<h2 class='title'><a name="OVERVIEW">Overview</a></h2>
-<p>Filters, printer drivers, port monitors, and backends use a common interface
-for processing print jobs and communicating status information to the scheduler.
-Each filter is run with a standard set of command-line arguments:<p>
+<p>Filters (which include printer drivers and port monitors) and backends
+are used to convert job files to a printable format and send that data to the
+printer itself. All of these programs use a common interface for processing
+print jobs and communicating status information to the scheduler. Each is run
+with a standard set of command-line arguments:<p>
<dl class="code">
<dd>The options that were provided when the job was submitted</dd>
<dt>argv[6]</dt>
- <dd>The file to print (first filter only)</dd>
+ <dd>The file to print (first program only)</dd>
</dl>
<p>The scheduler runs one or more of these programs to print any given job. The
<h3><a name="ENVIRONMENT">Environment Variables</a></h3>
-<p>The following environment variables are defined by the printing system:</p>
+<p>The following environment variables are defined by the printing system
+when running print filters and backends:</p>
<dl class="code">
application/postscript).</dd>
<dt>CUPS_CACHEDIR</dt>
- <dd>The directory where cache files can be stored.</dd>
+ <dd>The directory where cache files can be stored. Cache files can be
+ used to retain information between jobs or files in a job.</dd>
<dt>CUPS_DATADIR</dt>
- <dd>The directory where data files can be found.</dd>
+ <dd>The directory where (read-only) CUPS data files can be found.</dd>
<dt>CUPS_SERVERROOT</dt>
<dd>The root directory of the server.</dd>
file for this printer.</dd>
<dt>PRINTER</dt>
- <dd>The name of the printer.</dd>
+ <dd>The queue name of the class or printer.</dd>
<dt>RIP_CACHE</dt>
<dd>The recommended amount of memory to use for Raster Image
Processors (RIPs).</dd>
+ <dt>TMPDIR</dt>
+ <dd>The directory where temporary files should be created.</dd>
+
</dl>
<h3><a name="MESSAGES">Communicating with the Scheduler</a></h3>
-<p>Filters and backends communicate wih the scheduler by writing messages
-to the standard error file. For example, the following code sets the current
-printer state message to "Printing page 5":</p>
+<p>Filters and backends communicate with the scheduler by writing messages
+to the standard error file. The scheduler reads messages from all filters in
+a job and processes the message based on its prefix. For example, the following
+code sets the current printer state message to "Printing page 5":</p>
<pre class="example">
int page = 5;
<dt>ATTR: attribute=value [attribute=value]</dt>
<dd>Sets the named printer or job attribute(s). Typically this is used
to set the <code>marker-colors</code>, <code>marker-levels</code>,
- <code>marker-names</code>, <code>marker-types</code>,
- <code>printer-alert</code>, and <code>printer-alert-description</code>
- printer attributes.</dd>
+ <code>marker-message</code>, <code>marker-names</code>,
+ <code>marker-types</code>, <code>printer-alert</code>, and
+ <code>printer-alert-description</code> printer attributes. Standard
+ <code>marker-types</code> values are listed in <a href='#TABLE1'>Table
+ 1</a>.</dd>
<dt>CRIT: message</dt>
<dd>Sets the printer-state-message attribute and adds the specified
<dt>ERROR: message</dt>
<dd>Sets the printer-state-message attribute and adds the specified
- message to the current error log file using the "error" log level.</dd>
+ message to the current error log file using the "error" log level.
+ Use "ERROR:" messages for non-persistent processing errors.</dd>
<dt>INFO: message</dt>
<dd>Sets the printer-state-message attribute. If the current log level
<dt>STATE: + printer-state-reason [printer-state-reason ...]</dt>
<dt>STATE: - printer-state-reason [printer-state-reason ...]</dt>
<dd>Sets, adds, or removes printer-state-reason keywords to the
- current queue. Typically this is used to indicate media, ink, and
- toner conditions on a printer.</dd>
+ current queue. Typically this is used to indicate persistent media,
+ ink, toner, and configuration conditions or errors on a printer.
+ <a href='#TABLE2'>Table 2</a> lists the standard state keywords -
+ use vendor-prefixed ("com.acme.foo") keywords for custom states.</dd>
<dt>WARNING: message</dt>
<dd>Sets the printer-state-message attribute and adds the specified
<p>Messages without one of these prefixes are treated as if they began with
the "DEBUG:" prefix string.</p>
+
+<div class='table'><table width='80%' summary='Table 1: Standard marker-types Values'>
+<caption>Table 1: <a name='TABLE1'>Standard marker-types Values</a></caption>
+<thead>
+<tr>
+ <th>marker-type</th>
+ <th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>developer</td>
+ <td>Developer unit</td>
+</tr>
+<tr>
+ <td>fuser</td>
+ <td>Fuser unit</td>
+</tr>
+<tr>
+ <td>fuserCleaningPad</td>
+ <td>Fuser cleaning pad</td>
+</tr>
+<tr>
+ <td>fuserOil</td>
+ <td>Fuser oil</td>
+</tr>
+<tr>
+ <td>ink</td>
+ <td>Ink supply</td>
+</tr>
+<tr>
+ <td>opc</td>
+ <td>Photo conductor</td>
+</tr>
+<tr>
+ <td>solidWax</td>
+ <td>Wax supply</td>
+</tr>
+<tr>
+ <td>staples</td>
+ <td>Staple supply</td>
+</tr>
+<tr>
+ <td>toner</td>
+ <td>Toner supply</td>
+</tr>
+<tr>
+ <td>transferUnit</td>
+ <td>Transfer unit</td>
+</tr>
+<tr>
+ <td>wasteInk</td>
+ <td>Waste ink tank</td>
+</tr>
+<tr>
+ <td>wasteToner</td>
+ <td>Waste toner tank</td>
+</tr>
+<tr>
+ <td>wasteWax</td>
+ <td>Waste wax tank</td>
+</tr>
+</tbody>
+</table></div>
+
+<br>
+
+<div class='table'><table width='80%' summary='Table 2: Standard State Keywords'>
+<caption>Table 2: <a name='TABLE2'>Standard State Keywords</a></caption>
+<thead>
+<tr>
+ <th>Keyword</th>
+ <th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>connecting-to-device</td>
+ <td>Connecting to printer but not printing yet</td>
+</tr>
+<tr>
+ <td>cover-open</td>
+ <td>A cover is open on the printer</td>
+</tr>
+<tr>
+ <td>input-tray-missing</td>
+ <td>An input tray is missing from the printer</td>
+</tr>
+<tr>
+ <td>marker-supply-empty</td>
+ <td>Out of ink</td>
+</tr>
+<tr>
+ <td>marker-supply-low</td>
+ <td>Low on ink</td>
+</tr>
+<tr>
+ <td>marker-waste-almost-full</td>
+ <td>Waste tank almost full</td>
+</tr>
+<tr>
+ <td>marker-waste-full</td>
+ <td>Waste tank full</td>
+</tr>
+<tr>
+ <td>media-empty</td>
+ <td>Out of media</td>
+</tr>
+<tr>
+ <td>media-jam</td>
+ <td>Media is jammed in the printer</td>
+</tr>
+<tr>
+ <td>media-low</td>
+ <td>Low on media</td>
+</tr>
+<tr>
+ <td>paused</td>
+ <td>Stop the printer</td>
+</tr>
+<tr>
+ <td>timed-out</td>
+ <td>Unable to connect to printer</td>
+</tr>
+<tr>
+ <td>toner-empty</td>
+ <td>Out of toner</td>
+</tr>
+<tr>
+ <td>toner-low</td>
+ <td>Low on toner</td>
+</tr>
+</tbody>
+</table></div>
+
<h3><a name="COMMUNICATING_BACKEND">Communicating with the Backend</a></h3>
<p>Filters can communicate with the backend via the
bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0.0);
</pre>
-The
+<p>Filters can also use <code>select()</code> or <code>poll()</code> on the
+back-channel file descriptor (3 or <code>CUPS_BC_FD</code>) to read data only
+when it is available.</p>
+
+<p>The
<a href="#cupsSideChannelDoRequest"><code>cupsSideChannelDoRequest</code></a>
function allows you to get out-of-band status information and do synchronization
with the device. For example, the following code gets the current IEEE-1284
int datalen;
<a href="#cups_sc_status_t">cups_sc_status_t</a> status;
-/* Tell cupsSideChannelDoRequest() how big our buffer is, less 1 byte for nul-termination... */
+/* Tell cupsSideChannelDoRequest() how big our buffer is, less 1 byte for
+ nul-termination... */
datalen = sizeof(data) - 1;
/* Get the IEEE-1284 device ID, waiting for up to 1 second */
char buffer[8192];
ssize_t bytes;
+/* Obtain data from printer/device */
+...
+
/* Use a timeout of 1.0 seconds to give filters a chance to read */
cupsBackChannelWrite(buffer, bytes, 1.0);
</pre>
<h4 class="parameters">Parameters</h4>
<dl>
<dt>buffer</dt>
-<dd class="description">Buffer to read</dd>
+<dd class="description">Buffer to read into</dd>
<dt>bytes</dt>
<dd class="description">Bytes to read</dd>
<dt>timeout</dt>
-<dd class="description">Timeout in seconds</dd>
+<dd class="description">Timeout in seconds, typically 0.0 to poll</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Bytes read or -1 on error</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">Reads up to "bytes" bytes from the backchannel. The "timeout"
-parameter controls how many seconds to wait for the data - use
-0.0 to return immediately if there is no data, -1.0 to wait
-for data indefinitely.
+<p class="discussion">Reads up to "bytes" bytes from the backchannel/backend. The "timeout"
+parameter controls how many seconds to wait for the data - use 0.0 to
+return immediately if there is no data, -1.0 to wait for data indefinitely.
</p>
<h3 class="function"><span class="info"> CUPS 1.2 </span><a name="cupsBackChannelWrite">cupsBackChannelWrite</a></h3>
<dt>bytes</dt>
<dd class="description">Bytes to write</dd>
<dt>timeout</dt>
-<dd class="description">Timeout in seconds</dd>
+<dd class="description">Timeout in seconds, typically 1.0</dd>
</dl>
<h4 class="returnvalue">Return Value</h4>
<p class="description">Bytes written or -1 on error</p>
<h4 class="discussion">Discussion</h4>
-<p class="discussion">Writes "bytes" bytes to the backchannel. The "timeout" parameter
+<p class="discussion">Writes "bytes" bytes to the backchannel/filter. The "timeout" parameter
controls how many seconds to wait for the data to be written - use
0.0 to return immediately if the data cannot be written, -1.0 to wait
indefinitely.
<dd class="description">Job failed, stop queue</dd>
</dl>
<h3 class="enumeration"><a name="cups_sc_bidi_e">cups_sc_bidi_e</a></h3>
-<p class="description">Bidirectional capabilities</p>
+<p class="description">Bidirectional capability values</p>
<h4 class="constants">Constants</h4>
<dl>
<dt>CUPS_SC_BIDI_NOT_SUPPORTED </dt>
<dt>CUPS_SC_STATE_MEDIA_LOW </dt>
<dd class="description">Paper low condition</dd>
<dt>CUPS_SC_STATE_OFFLINE </dt>
-<dd class="description">Device is off-line</dd>
+<dd class="description">Device is offline</dd>
<dt>CUPS_SC_STATE_ONLINE </dt>
-<dd class="description">Device is on-line</dd>
+<dd class="description">Device is online</dd>
</dl>
<h3 class="enumeration"><a name="cups_sc_status_e">cups_sc_status_e</a></h3>
<p class="description">Response status codes</p>