<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <!-- SECTION: Programming --> <head> <title>CUPS API </title> <meta name="keywords" content="Programming"> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <meta name="creator" content="Mini-XML v2.7"> <style type="text/css"><!-- BODY { font-family: lucida grande, geneva, helvetica, arial, sans-serif; } H1, H2, H3, H4, H5, H6, P, TD, TH { font-family: lucida grande, geneva, helvetica, arial, sans-serif; } KBD { font-family: monaco, courier, monospace; font-weight: bold; } PRE { font-family: monaco, courier, monospace; } PRE.command { border: dotted thin #7f7f7f; margin-left: 36pt; padding: 10px; } P.compact { margin: 0; } P.example { font-style: italic; margin-left: 36pt; } PRE.example { background: #eeeeee; border: dotted thin #999999; margin-left: 36pt; padding: 10pt; } PRE.command EM, PRE.example EM { font-family: lucida grande, geneva, helvetica, arial, sans-serif; } P.command { font-family: monaco, courier, monospace; margin-left: 36pt; } P.formula { font-style: italic; margin-left: 36pt; } BLOCKQUOTE { background: #eeeeee; border: solid thin #999999; padding: 10pt; } A IMG { border: none; } A:link:hover IMG { background: #f0f0f0; border-radius: 10px; -moz-border-radius: 10px; } A:link, A:visited { font-weight: normal; text-decoration: none; } A:link:hover, A:visited:hover, A:active { text-decoration: underline; } SUB, SUP { font-size: 50%; } TR.data, TD.data, TR.data TD { margin-top: 10pt; padding: 5pt; border-bottom: solid 1pt #999999; } TR.data TH { border-bottom: solid 1pt #999999; padding-top: 10pt; padding-left: 5pt; text-align: left; } DIV.table TABLE { border: solid thin #999999; border-collapse: collapse; border-spacing: 0; margin-left: auto; margin-right: auto; } DIV.table CAPTION { caption-side: top; font-size: 120%; font-style: italic; font-weight: bold; margin-left: auto; margin-right: auto; } DIV.table TABLE TD { border: solid thin #cccccc; padding-top: 5pt; } DIV.table TABLE TH { background: #cccccc; border: none; border-bottom: solid thin #999999; } DIV.figure TABLE { margin-left: auto; margin-right: auto; } DIV.figure CAPTION { caption-side: bottom; font-size: 120%; font-style: italic; font-weight: bold; margin-left: auto; margin-right: auto; } TH.label { text-align: right; vertical-align: top; } TH.sublabel { text-align: right; font-weight: normal; } HR { border: solid thin; } SPAN.info { background: black; border: thin solid black; color: white; font-size: 80%; font-style: italic; font-weight: bold; white-space: nowrap; } H2 SPAN.info, H3 SPAN.info, H4 SPAN.info { float: right; font-size: 100%; } H1.title { } H2.title, H3.title { border-bottom: solid 2pt #000000; } DIV.indent, TABLE.indent { margin-top: 2em; margin-left: auto; margin-right: auto; width: 90%; } TABLE.indent { border-collapse: collapse; } TABLE.indent TD, TABLE.indent TH { padding: 0; } TABLE.list { border-collapse: collapse; margin-left: auto; margin-right: auto; width: 90%; } TABLE.list TH { background: white; border-bottom: solid thin #cccccc; color: #444444; padding-top: 10pt; padding-left: 5pt; text-align: left; vertical-align: bottom; white-space: nowrap; } TABLE.list TH A { color: #4444cc; } TABLE.list TD { border-bottom: solid thin #eeeeee; padding-top: 5pt; padding-left: 5pt; } TABLE.list TR:nth-child(even) { background: #f8f8f8; } TABLE.list TR:nth-child(odd) { background: #f4f4f4; } DT { margin-left: 36pt; margin-top: 12pt; } DD { margin-left: 54pt; } DL.category DT { font-weight: bold; } P.summary { margin-left: 36pt; font-family: monaco, courier, monospace; } DIV.summary TABLE { border: solid thin #999999; border-collapse: collapse; border-spacing: 0; margin: 10px; } DIV.summary TABLE TD, DIV.summary TABLE TH { border: solid thin #999999; padding: 5px; text-align: left; vertical-align: top; } DIV.summary TABLE THEAD TH { background: #eeeeee; } /* API documentation styles... */ div.body h1 { margin: 0; } div.body h2 { margin-top: 1.5em; } div.body h3, div.body h4, div.body h5 { margin-bottom: 0.5em; margin-top: 1.5em; } .class, .enumeration, .function, .struct, .typedef, .union { border-bottom: solid thin #999999; margin-bottom: 0; margin-top: 2em; } .description { margin-top: 0.5em; } code, p.code, pre, ul.code li { font-family: monaco, courier, monospace; font-size: 90%; } ul.code, ul.contents, ul.subcontents { list-style-type: none; margin: 0; padding-left: 0; } ul.code li { margin: 0; } ul.contents > li { margin-top: 1em; } ul.contents li ul.code, ul.contents li ul.subcontents { padding-left: 2em; } div.body dl { margin-left: 0; margin-top: 0; } div.body dt { font-style: italic; margin-left: 0; margin-top: 0; } div.body dd { margin-bottom: 0.5em; } /* This is just for the HTML files generated with the framedhelp target */ div.contents { background: #e8e8e8; border: solid thin black; padding: 10px; } div.contents h1 { font-size: 110%; } div.contents h2 { font-size: 100%; } div.contents ul.contents { font-size: 80%; } div.contents ul.subcontents li { margin-left: 1em; text-indent: -1em; } --></style> </head> <body> <div class='body'> <!-- "$Id$" CUPS API header for CUPS. Copyright 2008-2011 by Apple Inc. These coded instructions, statements, and computer programs are the property of Apple Inc. and are protected by Federal copyright law. Distribution and use rights are outlined in the file "LICENSE.txt" which should have been included with this file. If this file is file is missing or damaged, see the license at "http://www.cups.org/". --> <h1 class='title'>CUPS API</h1> <div class='summary'><table summary='General Information'> <thead> <tr> <th>Header</th> <th>cups/cups.h</th> </tr> </thead> <tbody> <tr> <th>Library</th> <td>-lcups</td> </tr> <tr> <th>See Also</th> <td>Programming: <a href='api-overview.html' target='_top'>Introduction to CUPS Programming</a><br> Programming: <a href='api-array.html' target='_top'>Array API</a><br> Programming: <a href='api-filedir.html' target='_top'>File and Directory APIs</a><br> Programming: <a href='api-filter.html' target='_top'>Filter and Backend Programming</a><br> Programming: <a href='api-httpipp.html' target='_top'>HTTP and IPP APIs</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> </tr> </tbody> </table></div> <h2 class="title">Contents</h2> <ul class="contents"> <li><a href="#OVERVIEW">Overview</a><ul class="subcontents"> <li><a href="#CLIENTS_AND_SERVERS">Clients and Servers</a></li> <li><a href="#PRINTERS_AND_CLASSES">Printers and Classes</a></li> <li><a href="#OPTIONS">Options</a></li> <li><a href="#PRINT_JOBS">Print Jobs</a></li> <li><a href="#ERROR_HANDLING">Error Handling</a></li> <li><a href="#PASSWORDS_AND_AUTHENTICATION">Passwords and Authentication</a></li> </ul></li> <li><a href="#FUNCTIONS">Functions</a><ul class="code"> <li><a href="#appleGetPaperSize" title="Get the default paper size.">appleGetPaperSize</a></li> <li><a href="#cupsAddDest" title="Add a destination to the list of destinations.">cupsAddDest</a></li> <li><a href="#cupsAddOption" title="Add an option to an option array.">cupsAddOption</a></li> <li><a href="#cupsAdminCreateWindowsPPD" title="Create the Windows PPD file for a printer.">cupsAdminCreateWindowsPPD</a></li> <li><a href="#cupsAdminExportSamba" title="Export a printer to Samba.">cupsAdminExportSamba</a></li> <li><a href="#cupsAdminGetServerSettings" title="Get settings from the server.">cupsAdminGetServerSettings</a></li> <li><a href="#cupsAdminSetServerSettings" title="Set settings on the server.">cupsAdminSetServerSettings</a></li> <li><a href="#cupsCancelJob" title="Cancel a print job on the default server.">cupsCancelJob</a></li> <li><a href="#cupsCancelJob2" title="Cancel or purge a print job.">cupsCancelJob2</a></li> <li><a href="#cupsCreateJob" title="Create an empty job for streaming.">cupsCreateJob</a></li> <li><a href="#cupsEncryption" title="Get the current encryption settings.">cupsEncryption</a></li> <li><a href="#cupsFinishDocument" title="Finish sending a document.">cupsFinishDocument</a></li> <li><a href="#cupsFreeDests" title="Free the memory used by the list of destinations.">cupsFreeDests</a></li> <li><a href="#cupsFreeJobs" title="Free memory used by job data.">cupsFreeJobs</a></li> <li><a href="#cupsFreeOptions" title="Free all memory used by options.">cupsFreeOptions</a></li> <li><a href="#cupsGetClasses" title="Get a list of printer classes from the default server.">cupsGetClasses</a></li> <li><a href="#cupsGetDefault" title="Get the default printer or class for the default server.">cupsGetDefault</a></li> <li><a href="#cupsGetDefault2" title="Get the default printer or class for the specified server.">cupsGetDefault2</a></li> <li><a href="#cupsGetDest" title="Get the named destination from the list.">cupsGetDest</a></li> <li><a href="#cupsGetDests" title="Get the list of destinations from the default server.">cupsGetDests</a></li> <li><a href="#cupsGetDests2" title="Get the list of destinations from the specified server.">cupsGetDests2</a></li> <li><a href="#cupsGetJobs" title="Get the jobs from the default server.">cupsGetJobs</a></li> <li><a href="#cupsGetJobs2" title="Get the jobs from the specified server.">cupsGetJobs2</a></li> <li><a href="#cupsGetNamedDest" title="Get options for the named destination.">cupsGetNamedDest</a></li> <li><a href="#cupsGetOption" title="Get an option value.">cupsGetOption</a></li> <li><a href="#cupsGetPPD" title="Get the PPD file for a printer on the default server.">cupsGetPPD</a></li> <li><a href="#cupsGetPPD2" title="Get the PPD file for a printer from the specified server.">cupsGetPPD2</a></li> <li><a href="#cupsGetPPD3" title="Get the PPD file for a printer on the specified server if it has changed.">cupsGetPPD3</a></li> <li><a href="#cupsGetPassword" title="Get a password from the user.">cupsGetPassword</a></li> <li><a href="#cupsGetPassword2" title="Get a password from the user using the advanced password callback.">cupsGetPassword2</a></li> <li><a href="#cupsGetPrinters" title="Get a list of printers from the default server.">cupsGetPrinters</a></li> <li><a href="#cupsGetServerPPD" title="Get an available PPD file from the server.">cupsGetServerPPD</a></li> <li><a href="#cupsLangDefault" title="Return the default language.">cupsLangDefault</a></li> <li><a href="#cupsLangEncoding" title="Return the character encoding (us-ascii, etc.) for the given language.">cupsLangEncoding</a></li> <li><a href="#cupsLangFlush" title="Flush all language data out of the cache.">cupsLangFlush</a></li> <li><a href="#cupsLangFree" title="Free language data.">cupsLangFree</a></li> <li><a href="#cupsLangGet" title="Get a language.">cupsLangGet</a></li> <li><a href="#cupsNotifySubject" title="Return the subject for the given notification message.">cupsNotifySubject</a></li> <li><a href="#cupsNotifyText" title="Return the text for the given notification message.">cupsNotifyText</a></li> <li><a href="#cupsParseOptions" title="Parse options from a command-line argument.">cupsParseOptions</a></li> <li><a href="#cupsPrintFile" title="Print a file to a printer or class on the default server.">cupsPrintFile</a></li> <li><a href="#cupsPrintFile2" title="Print a file to a printer or class on the specified server.">cupsPrintFile2</a></li> <li><a href="#cupsPrintFiles" title="Print one or more files to a printer or class on the default server.">cupsPrintFiles</a></li> <li><a href="#cupsPrintFiles2" title="Print one or more files to a printer or class on the specified server.">cupsPrintFiles2</a></li> <li><a href="#cupsRemoveDest" title="Remove a destination from the destination list.">cupsRemoveDest</a></li> <li><a href="#cupsRemoveOption" title="Remove an option from an option array.">cupsRemoveOption</a></li> <li><a href="#cupsServer" title="Return the hostname/address of the current server.">cupsServer</a></li> <li><a href="#cupsSetClientCertCB" title="Set the client certificate callback.">cupsSetClientCertCB</a></li> <li><a href="#cupsSetCredentials" title="Set the default credentials to be used for SSL/TLS connections.">cupsSetCredentials</a></li> <li><a href="#cupsSetDefaultDest" title="Set the default destination.">cupsSetDefaultDest</a></li> <li><a href="#cupsSetDests" title="Save the list of destinations for the default server.">cupsSetDests</a></li> <li><a href="#cupsSetDests2" title="Save the list of destinations for the specified server.">cupsSetDests2</a></li> <li><a href="#cupsSetEncryption" title="Set the encryption preference.">cupsSetEncryption</a></li> <li><a href="#cupsSetPasswordCB" title="Set the password callback for CUPS.">cupsSetPasswordCB</a></li> <li><a href="#cupsSetPasswordCB2" title="Set the advanced password callback for CUPS.">cupsSetPasswordCB2</a></li> <li><a href="#cupsSetServer" title="Set the default server name and port.">cupsSetServer</a></li> <li><a href="#cupsSetServerCertCB" title="Set the server certificate callback.">cupsSetServerCertCB</a></li> <li><a href="#cupsSetUser" title="Set the default user name.">cupsSetUser</a></li> <li><a href="#cupsStartDocument" title="Add a document to a job created with cupsCreateJob().">cupsStartDocument</a></li> <li><a href="#cupsTempFd" title="Creates a temporary file.">cupsTempFd</a></li> <li><a href="#cupsTempFile" title="Generates a temporary filename.">cupsTempFile</a></li> <li><a href="#cupsTempFile2" title="Creates a temporary CUPS file.">cupsTempFile2</a></li> <li><a href="#cupsUser" title="Return the current user's name.">cupsUser</a></li> </ul></li> <li><a href="#TYPES">Data Types</a><ul class="code"> <li><a href="#cups_client_cert_cb_t" title="Client credentials callback ">cups_client_cert_cb_t</a></li> <li><a href="#cups_dest_t" title="Destination">cups_dest_t</a></li> <li><a href="#cups_device_cb_t" title="Device callback ">cups_device_cb_t</a></li> <li><a href="#cups_job_t" title="Job">cups_job_t</a></li> <li><a href="#cups_option_t" title="Printer Options">cups_option_t</a></li> <li><a href="#cups_password_cb2_t" title="New password callback ">cups_password_cb2_t</a></li> <li><a href="#cups_password_cb_t" title="Password callback">cups_password_cb_t</a></li> <li><a href="#cups_ptype_t" title="Printer type/capability bits">cups_ptype_t</a></li> <li><a href="#cups_server_cert_cb_t" title="Server credentials callback ">cups_server_cert_cb_t</a></li> </ul></li> <li><a href="#STRUCTURES">Structures</a><ul class="code"> <li><a href="#cups_dest_s" title="Destination">cups_dest_s</a></li> <li><a href="#cups_job_s" title="Job">cups_job_s</a></li> <li><a href="#cups_option_s" title="Printer Options">cups_option_s</a></li> </ul></li> <li><a href="#VARIABLES">Variables</a><ul class="code"> <li><a href="#CF_RETURNS_RETAINED" title="Get the Apple language identifier associated with a locale ID.">CF_RETURNS_RETAINED</a></li> </ul></li> <li><a href="#ENUMERATIONS">Constants</a><ul class="code"> <li><a href="#cups_ptype_e" title="Printer type/capability bit constants">cups_ptype_e</a></li> </ul></li> </ul> <!-- "$Id$" API introduction for CUPS. Copyright 2007-2011 by Apple Inc. Copyright 1997-2006 by Easy Software Products, all rights reserved. These coded instructions, statements, and computer programs are the property of Apple Inc. and are protected by Federal copyright law. Distribution and use rights are outlined in the file "LICENSE.txt" which should have been included with this file. If this file is file is missing or damaged, see the license at "http://www.cups.org/". --> <h2 class='title'><a name='OVERVIEW'>Overview</a></h2> <p>The CUPS API provides the convenience functions needed to support applications, filters, printer drivers, and backends that need to interface with the CUPS scheduler.</p> <h3><a name='CLIENTS_AND_SERVERS'>Clients and Servers</a></h3> <p>CUPS is based on the Internet Printing Protocol ("IPP"), which allows clients (applications) to communicate with a server (the scheduler) to get a list of printers, send print jobs, and so forth. You identify which server you want to communicate with using a pointer to the opaque structure <code>http_t</code>. All of the examples in this document use the <code>CUPS_HTTP_DEFAULT</code> constant, referring to the default connection to the scheduler. The <a href='api-httpipp.html' target='_top'>HTTP and IPP APIs</a> document provides more information on server connections.</p> <h3><a name='PRINTERS_AND_CLASSES'>Printers and Classes</a></h3> <p>Printers and classes (collections of printers) are accessed through the <a href="#cups_dest_t"><code>cups_dest_t</code></a> structure which includes the name (<code>name</code>), instance (<code>instance</code> - a way of selecting certain saved options/settings), and the options and attributes associated with that destination (<code>num_options</code> and <code>options</code>). Destinations are created using the <a href="#cupsGetDests"><code>cupsGetDests</code></a> function and freed using the <a href='#cupsFreeDests'><code>cupsFreeDests</code></a> function. The <a href='#cupsGetDest'><code>cupsGetDest</code></a> function finds a specific destination for printing:</p> <pre class='example'> #include <cups/cups.h> <a href='#cups_dest_t'>cups_dest_t</a> *dests; int num_dests = <a href='#cupsGetDests'>cupsGetDests</a>(&dests); <a href='#cups_dest_t'>cups_dest_t</a> *dest = <a href='#cupsGetDest'>cupsGetDest</a>("name", NULL, num_dests, dests); /* do something with dest */ <a href='#cupsFreeDests'>cupsFreeDests</a>(num_dests, dests); </pre> <p>Passing <code>NULL</code> to <a href='#cupsGetDest'><code>cupsGetDest</code></a> for the destination name will return the default destination. Similarly, passing a <code>NULL</code> instance will return the default instance for that destination.</p> <div class='table'><table summary='Table 1: Printer Attributes' width='80%'> <caption>Table 1: <a name='TABLE1'>Printer Attributes</a></caption> <thead> <tr> <th>Attribute Name</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>"auth-info-required"</td> <td>The type of authentication required for printing to this destination: "none", "username,password", "domain,username,password", or "negotiate" (Kerberos)</td> </tr> <tr> <td>"printer-info"</td> <td>The human-readable description of the destination such as "My Laser Printer".</td> </tr> <tr> <td>"printer-is-accepting-jobs"</td> <td>"true" if the destination is accepting new jobs, "false" if not.</td> </tr> <tr> <td>"printer-is-shared"</td> <td>"true" if the destination is being shared with other computers, "false" if not.</td> </tr> <tr> <td>"printer-location"</td> <td>The human-readable location of the destination such as "Lab 4".</td> </tr> <tr> <td>"printer-make-and-model"</td> <td>The human-readable make and model of the destination such as "HP LaserJet 4000 Series".</td> </tr> <tr> <td>"printer-state"</td> <td>"3" if the destination is idle, "4" if the destination is printing a job, and "5" if the destination is stopped.</td> </tr> <tr> <td>"printer-state-change-time"</td> <td>The UNIX time when the destination entered the current state.</td> </tr> <tr> <td>"printer-state-reasons"</td> <td>Additional comma-delimited state keywords for the destination such as "media-tray-empty-error" and "toner-low-warning".</td> </tr> <tr> <td>"printer-type"</td> <td>The <a href='#cups_printer_t'><code>cups_printer_t</code></a> value associated with the destination.</td> </tr> </tbody> </table></div> <h3><a name='OPTIONS'>Options</a></h3> <p>Options are stored in arrays of <a href='#cups_option_t'><code>cups_option_t</code></a> structures. Each option has a name (<code>name</code>) and value (<code>value</code>) associated with it. The <a href='#cups_dest_t'><code>cups_dest_t</code></a> <code>num_options</code> and <code>options</code> members contain the default options for a particular destination, along with several informational attributes about the destination as shown in <a href='#TABLE1'>Table 1</a>. The <a href='#cupsGetOption'><code>cupsGetOption</code></a> function gets the value for the named option. For example, the following code lists the available destinations and their human-readable descriptions:</p> <pre class='example'> #include <cups/cups.h> <a href='#cups_dest_t'>cups_dest_t</a> *dests; int num_dests = <a href='#cupsGetDests'>cupsGetDests</a>(&dests); <a href='#cups_dest_t'>cups_dest_t</a> *dest; int i; const char *value; for (i = num_dests, dest = dests; i > 0; i --, dest ++) if (dest->instance == NULL) { value = <a href='#cupsGetOption'>cupsGetOption</a>("printer-info", dest->num_options, dest->options); printf("%s (%s)\n", dest->name, value ? value : "no description"); } <a href='#cupsFreeDests'>cupsFreeDests</a>(num_dests, dests); </pre> <p>You can create your own option arrays using the <a href='#cupsAddOption'><code>cupsAddOption</code></a> function, which adds a single named option to an array:</p> <pre class='example'> #include <cups/cups.h> int num_options = 0; <a href='#cups_option_t'>cups_option_t</a> *options = NULL; /* The returned num_options value is updated as needed */ num_options = <a href='#cupsAddOption'>cupsAddOption</a>("first", "value", num_options, &options); /* This adds a second option value */ num_options = <a href='#cupsAddOption'>cupsAddOption</a>("second", "value", num_options, &options); /* This replaces the first option we added */ num_options = <a href='#cupsAddOption'>cupsAddOption</a>("first", "new value", num_options, &options); </pre> <p>Use a <code>for</code> loop to copy the options from a destination:</p> <pre class='example'> #include <cups/cups.h> int i; int num_options = 0; <a href='#cups_option_t'>cups_option_t</a> *options = NULL; <a href='#cups_dest_t'>cups_dest_t</a> *dest; for (i = 0; i < dest->num_options; i ++) num_options = <a href='#cupsAddOption'>cupsAddOption</a>(dest->options[i].name, dest->options[i].value, num_options, &options); </pre> <p>Use the <a href='#cupsFreeOptions'><code>cupsFreeOptions</code></a> function to free the options array when you are done using it:</p> <pre class='example'> <a href='#cupsFreeOptions'>cupsFreeOptions</a>(num_options, options); </pre> <h3><a name='PRINT_JOBS'>Print Jobs</a></h3> <p>Print jobs are identified by a locally-unique job ID number from 1 to 2<sup>31</sup>-1 and have options and one or more files for printing to a single destination. The <a href='#cupsPrintFile'><code>cupsPrintFile</code></a> function creates a new job with one file. The following code prints the CUPS test page file:</p> <pre class='example'> #include <cups/cups.h> <a href='#cups_dest_t'>cups_dest_t</a> *dest; int num_options; <a href='#cups_option_t'>cups_option_t</a> *options; int job_id; /* Print a single file */ job_id = <a href='#cupsPrintFile'>cupsPrintFile</a>(dest->name, "/usr/share/cups/data/testprint.ps", "Test Print", num_options, options); </pre> <p>The <a href='#cupsPrintFiles'><code>cupsPrintFiles</code></a> function creates a job with multiple files. The files are provided in a <code>char *</code> array:</p> <pre class='example'> #include <cups/cups.h> <a href='#cups_dest_t'>cups_dest_t</a> *dest; int num_options; <a href='#cups_option_t'>cups_option_t</a> *options; int job_id; char *files[3] = { "file1.pdf", "file2.pdf", "file3.pdf" }; /* Print three files */ job_id = <a href='#cupsPrintFiles'>cupsPrintFiles</a>(dest->name, 3, files, "Test Print", num_options, options); </pre> <p>Finally, the <a href='#cupsCreateJob'><code>cupsCreateJob</code></a> function creates a new job with no files in it. Files are added using the <a href='#cupsStartDocument'><code>cupsStartDocument</code></a>, <a href='api-httpipp.html#cupsWriteRequestData'><code>cupsWriteRequestData</code></a>, and <a href='#cupsFinishDocument'><code>cupsFinishDocument</code></a> functions. The following example creates a job with 10 text files for printing:</p> <pre class='example'> #include <cups/cups.h> <a href='#cups_dest_t'>cups_dest_t</a> *dest; int num_options; <a href='#cups_option_t'>cups_option_t</a> *options; int job_id; int i; char buffer[1024]; /* Create the job */ job_id = <a href='#cupsCreateJob'>cupsCreateJob</a>(CUPS_HTTP_DEFAULT, dest->name, "10 Text Files", num_options, options); /* If the job is created, add 10 files */ if (job_id > 0) { for (i = 1; i <= 10; i ++) { snprintf(buffer, sizeof(buffer), "file%d.txt", i); <a href='#cupsStartDocument'>cupsStartDocument</a>(CUPS_HTTP_DEFAULT, dest->name, job_id, buffer, CUPS_FORMAT_TEXT, i == 10); snprintf(buffer, sizeof(buffer), "File %d\n" "\n" "One fish,\n" "Two fish,\n "Red fish,\n "Blue fish\n", i); /* cupsWriteRequestData can be called as many times as needed */ <a href='#cupsWriteRequestData'>cupsWriteRequestData</a>(CUPS_HTTP_DEFAULT, buffer, strlen(buffer)); <a href='#cupsFinishDocument'>cupsFinishDocument</a>(CUPS_HTTP_DEFAULT, dest->name); } } </pre> <p>Once you have created a job, you can monitor its status using the <a href='#cupsGetJobs'><code>cupsGetJobs</code></a> function, which returns an array of <a href='#cups_job_t'><code>cups_job_t</code></a> structures. Each contains the job ID (<code>id</code>), destination name (<code>dest</code>), title (<code>title</code>), and other information associated with the job. The job array is freed using the <a href='#cupsFreeJobs'><code>cupsFreeJobs</code></a> function. The following example monitors a specific job ID, showing the current job state once every 5 seconds until the job is completed:</p> <pre class='example'> #include <cups/cups.h> <a href='#cups_dest_t'>cups_dest_t</a> *dest; int job_id; int num_jobs; <a href='#cups_job_t'>cups_job_t</a> *jobs; int i; ipp_jstate_t job_state = IPP_JOB_PENDING; while (job_state < IPP_JOB_STOPPED) { /* Get my jobs (1) with any state (-1) */ num_jobs = <a href='#cupsGetJobs'>cupsGetJobs</a>(&jobs, dest->name, 1, -1); /* Loop to find my job */ job_state = IPP_JOB_COMPLETED; for (i = 0; i < num_jobs; i ++) if (jobs[i].id == job_id) { job_state = jobs[i].state; break; } /* Free the job array */ <a href='#cupsFreeJobs'>cupsFreeJobs</a>(num_jobs, jobs); /* Show the current state */ switch (job_state) { case IPP_JOB_PENDING : printf("Job %d is pending.\n", job_id); break; case IPP_JOB_HELD : printf("Job %d is held.\n", job_id); break; case IPP_JOB_PROCESSING : printf("Job %d is processing.\n", job_id); break; case IPP_JOB_STOPPED : printf("Job %d is stopped.\n", job_id); break; case IPP_JOB_CANCELED : printf("Job %d is canceled.\n", job_id); break; case IPP_JOB_ABORTED : printf("Job %d is aborted.\n", job_id); break; case IPP_JOB_COMPLETED : printf("Job %d is completed.\n", job_id); break; } /* Sleep if the job is not finished */ if (job_state < IPP_JOB_STOPPED) sleep(5); } </pre> <p>To cancel a job, use the <a href='#cupsCancelJob'><code>cupsCancelJob</code></a> function with the job ID:</p> <pre class='example'> #include <cups/cups.h> <a href='#cups_dest_t'>cups_dest_t</a> *dest; int job_id; <a href='#cupsCancelJob'>cupsCancelJob</a>(dest->name, job_id); </pre> <h3><a name='ERROR_HANDLING'>Error Handling</a></h3> <p>If any of the CUPS API printing functions returns an error, the reason for that error can be found by calling the <a href='#cupsLastError'><code>cupsLastError</code></a> and <a href='#cupsLastErrorString'><code>cupsLastErrorString</code></a> functions. <a href='#cupsLastError'><code>cupsLastError</code></a> returns the last IPP error code (<a href='api-httpipp.html#ipp_status_t'><code>ipp_status_t</code></a>) that was encountered, while <a href='#cupsLastErrorString'><code>cupsLastErrorString</code></a> returns a (localized) human-readable string that can be shown to the user. For example, if any of the job creation functions returns a job ID of 0, you can use <a href='#cupsLastErrorString'><code>cupsLastErrorString</code></a> to show the reason why the job could not be created:</p> <pre class='example'> #include <cups/cups.h> int job_id; if (job_id == 0) puts(cupsLastErrorString()); </pre> <h3><a name='PASSWORDS_AND_AUTHENTICATION'>Passwords and Authentication</a></h3> <p>CUPS supports authentication of any request, including submission of print jobs. The default mechanism for getting the username and password is to use the login user and a password from the console.</p> <p>To support other types of applications, in particular Graphical User Interfaces ("GUIs"), the CUPS API provides functions to set the default username and to register a callback function that returns a password string.</p> <p>The <a href="#cupsSetPasswordCB"><code>cupsSetPasswordCB</code></a> function is used to set a password callback in your program. Only one function can be used at any time.</p> <p>The <a href="#cupsSetUser"><code>cupsSetUser</code></a> function sets the current username for authentication. This function can be called by your password callback function to change the current username as needed.</p> <p>The following example shows a simple password callback that gets a username and password from the user:</p> <pre class='example'> #include <cups/cups.h> const char * my_password_cb(const char *prompt) { char user[65]; puts(prompt); /* Get a username from the user */ printf("Username: "); if (fgets(user, sizeof(user), stdin) == NULL) return (NULL); /* Strip the newline from the string and set the user */ user[strlen(user) - 1] = '\0'; <a href='#cupsSetUser'>cupsSetUser</a>(user); /* Use getpass() to ask for the password... */ return (getpass("Password: ")); } <a href='#cupsSetPasswordCB'>cupsSetPasswordCB</a>(my_password_cb); </pre> <p>Similarly, a GUI could display the prompt string in a window with input fields for the username and password. The username should default to the string returned by the <a href="#cupsUser"><code>cupsUser</code></a> function.</p> <h2 class="title"><a name="FUNCTIONS">Functions</a></h2> <h3 class="function"><a name="appleGetPaperSize">appleGetPaperSize</a></h3> <p class="description">Get the default paper size.</p> <p class="code"> char *appleGetPaperSize (<br> char *name,<br> int namesize<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Paper size name buffer</dd> <dt>namesize</dt> <dd class="description">Size of buffer</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Default paper size</p> <h3 class="function"><a name="cupsAddDest">cupsAddDest</a></h3> <p class="description">Add a destination to the list of destinations.</p> <p class="code"> int cupsAddDest (<br> const char *name,<br> const char *instance,<br> int num_dests,<br> <a href="#cups_dest_t">cups_dest_t</a> **dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Destination name</dd> <dt>instance</dt> <dd class="description">Instance name or <code>NULL</code> for none/primary</dd> <dt>num_dests</dt> <dd class="description">Number of destinations</dd> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">New number of destinations</p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function cannot be used to add a new class or printer queue, it only adds a new container of saved options for the named destination or instance.<br> <br> If the named destination already exists, the destination list is returned unchanged. Adding a new instance of a destination creates a copy of that destination's options.<br> <br> Use the <a href="#cupsSaveDests"><code>cupsSaveDests</code></a> function to save the updated list of destinations to the user's lpoptions file.</p> <h3 class="function"><a name="cupsAddOption">cupsAddOption</a></h3> <p class="description">Add an option to an option array.</p> <p class="code"> int cupsAddOption (<br> const char *name,<br> const char *value,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> **options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Name of option</dd> <dt>value</dt> <dd class="description">Value of option</dd> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Pointer to options</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Number of options</p> <h4 class="discussion">Discussion</h4> <p class="discussion">New option arrays can be initialized simply by passing 0 for the "num_options" parameter.</p> <h3 class="function"><span class="info"> CUPS 1.2/Mac OS X 10.5 </span><a name="cupsAdminCreateWindowsPPD">cupsAdminCreateWindowsPPD</a></h3> <p class="description">Create the Windows PPD file for a printer.</p> <p class="code"> char *cupsAdminCreateWindowsPPD (<br> http_t *http,<br> const char *dest,<br> char *buffer,<br> int bufsize<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>dest</dt> <dd class="description">Printer or class</dd> <dt>buffer</dt> <dd class="description">Filename buffer</dd> <dt>bufsize</dt> <dd class="description">Size of filename buffer</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">PPD file or NULL</p> <h3 class="function"><span class="info"> CUPS 1.2/Mac OS X 10.5 </span><a name="cupsAdminExportSamba">cupsAdminExportSamba</a></h3> <p class="description">Export a printer to Samba.</p> <p class="code"> int cupsAdminExportSamba (<br> const char *dest,<br> const char *ppd,<br> const char *samba_server,<br> const char *samba_user,<br> const char *samba_password,<br> FILE *logfile<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>dest</dt> <dd class="description">Destination to export</dd> <dt>ppd</dt> <dd class="description">PPD file</dd> <dt>samba_server</dt> <dd class="description">Samba server</dd> <dt>samba_user</dt> <dd class="description">Samba username</dd> <dt>samba_password</dt> <dd class="description">Samba password</dd> <dt>logfile</dt> <dd class="description">Log file, if any</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">1 on success, 0 on failure</p> <h3 class="function"><span class="info"> CUPS 1.3/Mac OS X 10.5 </span><a name="cupsAdminGetServerSettings">cupsAdminGetServerSettings</a></h3> <p class="description">Get settings from the server.</p> <p class="code"> int cupsAdminGetServerSettings (<br> http_t *http,<br> int *num_settings,<br> <a href="#cups_option_t">cups_option_t</a> **settings<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>num_settings</dt> <dd class="description">Number of settings</dd> <dt>settings</dt> <dd class="description">Settings</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">1 on success, 0 on failure</p> <h4 class="discussion">Discussion</h4> <p class="discussion">The returned settings should be freed with cupsFreeOptions() when you are done with them. </p> <h3 class="function"><span class="info"> CUPS 1.3/Mac OS X 10.5 </span><a name="cupsAdminSetServerSettings">cupsAdminSetServerSettings</a></h3> <p class="description">Set settings on the server.</p> <p class="code"> int cupsAdminSetServerSettings (<br> http_t *http,<br> int num_settings,<br> <a href="#cups_option_t">cups_option_t</a> *settings<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>num_settings</dt> <dd class="description">Number of settings</dd> <dt>settings</dt> <dd class="description">Settings</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">1 on success, 0 on failure</p> <h3 class="function"><a name="cupsCancelJob">cupsCancelJob</a></h3> <p class="description">Cancel a print job on the default server.</p> <p class="code"> int cupsCancelJob (<br> const char *name,<br> int job_id<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Name of printer or class</dd> <dt>job_id</dt> <dd class="description">Job ID, <code>CUPS_JOBID_CURRENT</code> for the current job, or <code>CUPS_JOBID_ALL</code> for all jobs</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">1 on success, 0 on failure</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Pass <code>CUPS_JOBID_ALL</code> to cancel all jobs or <code>CUPS_JOBID_CURRENT</code> to cancel the current job on the named destination.<br> <br> Use the <a href="#cupsLastError"><code>cupsLastError</code></a> and <a href="#cupsLastErrorString"><code>cupsLastErrorString</code></a> functions to get the cause of any failure.</p> <h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsCancelJob2">cupsCancelJob2</a></h3> <p class="description">Cancel or purge a print job.</p> <p class="code"> ipp_status_t cupsCancelJob2 (<br> http_t *http,<br> const char *name,<br> int job_id,<br> int purge<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Name of printer or class</dd> <dt>job_id</dt> <dd class="description">Job ID, <code>CUPS_JOBID_CURRENT</code> for the current job, or <code>CUPS_JOBID_ALL</code> for all jobs</dd> <dt>purge</dt> <dd class="description">1 to purge, 0 to cancel</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">IPP status</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Canceled jobs remain in the job history while purged jobs are removed from the job history.<br> <br> Pass <code>CUPS_JOBID_ALL</code> to cancel all jobs or <code>CUPS_JOBID_CURRENT</code> to cancel the current job on the named destination.<br> <br> Use the <a href="#cupsLastError"><code>cupsLastError</code></a> and <a href="#cupsLastErrorString"><code>cupsLastErrorString</code></a> functions to get the cause of any failure. </p> <h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsCreateJob">cupsCreateJob</a></h3> <p class="description">Create an empty job for streaming.</p> <p class="code"> int cupsCreateJob (<br> http_t *http,<br> const char *name,<br> const char *title,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> *options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Destination name</dd> <dt>title</dt> <dd class="description">Title of job</dd> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Options</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Job ID or 0 on error</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Use this function when you want to stream print data using the <a href="#cupsStartDocument"><code>cupsStartDocument</code></a>, <a href="#cupsWriteRequestData"><code>cupsWriteRequestData</code></a>, and <a href="#cupsFinishDocument"><code>cupsFinishDocument</code></a> functions. If you have one or more files to print, use the <a href="#cupsPrintFile2"><code>cupsPrintFile2</code></a> or <a href="#cupsPrintFiles2"><code>cupsPrintFiles2</code></a> function instead. </p> <h3 class="function"><a name="cupsEncryption">cupsEncryption</a></h3> <p class="description">Get the current encryption settings.</p> <p class="code"> http_encryption_t cupsEncryption (void);</p> <h4 class="returnvalue">Return Value</h4> <p class="description">Encryption settings</p> <h4 class="discussion">Discussion</h4> <p class="discussion">The default encryption setting comes from the CUPS_ENCRYPTION environment variable, then the ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not set, the default is <code>HTTP_ENCRYPT_IF_REQUESTED</code>.<br> <br> Note: The current encryption setting is tracked separately for each thread in a program. Multi-threaded programs that override the setting via the <a href="#cupsSetEncryption"><code>cupsSetEncryption</code></a> function need to do so in each thread for the same setting to be used.</p> <h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsFinishDocument">cupsFinishDocument</a></h3> <p class="description">Finish sending a document.</p> <p class="code"> ipp_status_t cupsFinishDocument (<br> http_t *http,<br> const char *name<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Destination name</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Status of document submission</p> <h4 class="discussion">Discussion</h4> <p class="discussion">The document must have been started using <a href="#cupsStartDocument"><code>cupsStartDocument</code></a>. </p> <h3 class="function"><a name="cupsFreeDests">cupsFreeDests</a></h3> <p class="description">Free the memory used by the list of destinations.</p> <p class="code"> void cupsFreeDests (<br> int num_dests,<br> <a href="#cups_dest_t">cups_dest_t</a> *dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>num_dests</dt> <dd class="description">Number of destinations</dd> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h3 class="function"><a name="cupsFreeJobs">cupsFreeJobs</a></h3> <p class="description">Free memory used by job data.</p> <p class="code"> void cupsFreeJobs (<br> int num_jobs,<br> <a href="#cups_job_t">cups_job_t</a> *jobs<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>num_jobs</dt> <dd class="description">Number of jobs</dd> <dt>jobs</dt> <dd class="description">Jobs</dd> </dl> <h3 class="function"><a name="cupsFreeOptions">cupsFreeOptions</a></h3> <p class="description">Free all memory used by options.</p> <p class="code"> void cupsFreeOptions (<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> *options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Pointer to options</dd> </dl> <h3 class="function"><span class="info"> DEPRECATED </span><a name="cupsGetClasses">cupsGetClasses</a></h3> <p class="description">Get a list of printer classes from the default server.</p> <p class="code"> int cupsGetClasses (<br> char ***classes<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>classes</dt> <dd class="description">Classes</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Number of classes</p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function is deprecated - use <a href="#cupsGetDests"><code>cupsGetDests</code></a> instead. </p> <h3 class="function"><a name="cupsGetDefault">cupsGetDefault</a></h3> <p class="description">Get the default printer or class for the default server.</p> <p class="code"> const char *cupsGetDefault (void);</p> <h4 class="returnvalue">Return Value</h4> <p class="description">Default printer or <code>NULL</code></p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function returns the default printer or class as defined by the LPDEST or PRINTER environment variables. If these environment variables are not set, the server default destination is returned. Applications should use the <a href="#cupsGetDests"><code>cupsGetDests</code></a> and <a href="#cupsGetDest"><code>cupsGetDest</code></a> functions to get the user-defined default printer, as this function does not support the lpoptions-defined default printer.</p> <h3 class="function"><span class="info"> CUPS 1.1.21/Mac OS X 10.4 </span><a name="cupsGetDefault2">cupsGetDefault2</a></h3> <p class="description">Get the default printer or class for the specified server.</p> <p class="code"> const char *cupsGetDefault2 (<br> http_t *http<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Default printer or <code>NULL</code></p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function returns the default printer or class as defined by the LPDEST or PRINTER environment variables. If these environment variables are not set, the server default destination is returned. Applications should use the <a href="#cupsGetDests"><code>cupsGetDests</code></a> and <a href="#cupsGetDest"><code>cupsGetDest</code></a> functions to get the user-defined default printer, as this function does not support the lpoptions-defined default printer. </p> <h3 class="function"><a name="cupsGetDest">cupsGetDest</a></h3> <p class="description">Get the named destination from the list.</p> <p class="code"> <a href="#cups_dest_t">cups_dest_t</a> *cupsGetDest (<br> const char *name,<br> const char *instance,<br> int num_dests,<br> <a href="#cups_dest_t">cups_dest_t</a> *dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Destination name or <code>NULL</code> for the default destination</dd> <dt>instance</dt> <dd class="description">Instance name or <code>NULL</code></dd> <dt>num_dests</dt> <dd class="description">Number of destinations</dd> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Destination pointer or <code>NULL</code></p> <h4 class="discussion">Discussion</h4> <p class="discussion">Use the <a href="#cupsGetDests"><code>cupsGetDests</code></a> or <a href="#cupsGetDests2"><code>cupsGetDests2</code></a> functions to get a list of supported destinations for the current user.</p> <h3 class="function"><a name="cupsGetDests">cupsGetDests</a></h3> <p class="description">Get the list of destinations from the default server.</p> <p class="code"> int cupsGetDests (<br> <a href="#cups_dest_t">cups_dest_t</a> **dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Number of destinations</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Starting with CUPS 1.2, the returned list of destinations include the printer-info, printer-is-accepting-jobs, printer-is-shared, printer-make-and-model, printer-state, printer-state-change-time, printer-state-reasons, and printer-type attributes as options. CUPS 1.4 adds the marker-change-time, marker-colors, marker-high-levels, marker-levels, marker-low-levels, marker-message, marker-names, marker-types, and printer-commands attributes as well.<br> <br> Use the <a href="#cupsFreeDests"><code>cupsFreeDests</code></a> function to free the destination list and the <a href="#cupsGetDest"><code>cupsGetDest</code></a> function to find a particular destination.</p> <h3 class="function"><span class="info"> CUPS 1.1.21/Mac OS X 10.4 </span><a name="cupsGetDests2">cupsGetDests2</a></h3> <p class="description">Get the list of destinations from the specified server.</p> <p class="code"> int cupsGetDests2 (<br> http_t *http,<br> <a href="#cups_dest_t">cups_dest_t</a> **dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Number of destinations</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Starting with CUPS 1.2, the returned list of destinations include the printer-info, printer-is-accepting-jobs, printer-is-shared, printer-make-and-model, printer-state, printer-state-change-time, printer-state-reasons, and printer-type attributes as options. CUPS 1.4 adds the marker-change-time, marker-colors, marker-high-levels, marker-levels, marker-low-levels, marker-message, marker-names, marker-types, and printer-commands attributes as well.<br> <br> Use the <a href="#cupsFreeDests"><code>cupsFreeDests</code></a> function to free the destination list and the <a href="#cupsGetDest"><code>cupsGetDest</code></a> function to find a particular destination. </p> <h3 class="function"><a name="cupsGetJobs">cupsGetJobs</a></h3> <p class="description">Get the jobs from the default server.</p> <p class="code"> int cupsGetJobs (<br> <a href="#cups_job_t">cups_job_t</a> **jobs,<br> const char *name,<br> int myjobs,<br> int whichjobs<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>jobs</dt> <dd class="description">Job data</dd> <dt>name</dt> <dd class="description"><code>NULL</code> = all destinations, otherwise show jobs for named destination</dd> <dt>myjobs</dt> <dd class="description">0 = all users, 1 = mine</dd> <dt>whichjobs</dt> <dd class="description"><code>CUPS_WHICHJOBS_ALL</code>, <code>CUPS_WHICHJOBS_ACTIVE</code>, or <code>CUPS_WHICHJOBS_COMPLETED</code></dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Number of jobs</p> <h4 class="discussion">Discussion</h4> <p class="discussion">A "whichjobs" value of <code>CUPS_WHICHJOBS_ALL</code> returns all jobs regardless of state, while <code>CUPS_WHICHJOBS_ACTIVE</code> returns jobs that are pending, processing, or held and <code>CUPS_WHICHJOBS_COMPLETED</code> returns jobs that are stopped, canceled, aborted, or completed.</p> <h3 class="function"><span class="info"> CUPS 1.1.21/Mac OS X 10.4 </span><a name="cupsGetJobs2">cupsGetJobs2</a></h3> <p class="description">Get the jobs from the specified server.</p> <p class="code"> int cupsGetJobs2 (<br> http_t *http,<br> <a href="#cups_job_t">cups_job_t</a> **jobs,<br> const char *name,<br> int myjobs,<br> int whichjobs<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>jobs</dt> <dd class="description">Job data</dd> <dt>name</dt> <dd class="description"><code>NULL</code> = all destinations, otherwise show jobs for named destination</dd> <dt>myjobs</dt> <dd class="description">0 = all users, 1 = mine</dd> <dt>whichjobs</dt> <dd class="description"><code>CUPS_WHICHJOBS_ALL</code>, <code>CUPS_WHICHJOBS_ACTIVE</code>, or <code>CUPS_WHICHJOBS_COMPLETED</code></dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Number of jobs</p> <h4 class="discussion">Discussion</h4> <p class="discussion">A "whichjobs" value of <code>CUPS_WHICHJOBS_ALL</code> returns all jobs regardless of state, while <code>CUPS_WHICHJOBS_ACTIVE</code> returns jobs that are pending, processing, or held and <code>CUPS_WHICHJOBS_COMPLETED</code> returns jobs that are stopped, canceled, aborted, or completed. </p> <h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsGetNamedDest">cupsGetNamedDest</a></h3> <p class="description">Get options for the named destination.</p> <p class="code"> <a href="#cups_dest_t">cups_dest_t</a> *cupsGetNamedDest (<br> http_t *http,<br> const char *name,<br> const char *instance<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Destination name or <code>NULL</code> for the default destination</dd> <dt>instance</dt> <dd class="description">Instance name or <code>NULL</code></dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Destination or <code>NULL</code></p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function is optimized for retrieving a single destination and should be used instead of <a href="#cupsGetDests"><code>cupsGetDests</code></a> and <a href="#cupsGetDest"><code>cupsGetDest</code></a> when you either know the name of the destination or want to print to the default destination. If <code>NULL</code> is returned, the destination does not exist or there is no default destination.<br> <br> If "http" is <code>CUPS_HTTP_DEFAULT</code>, the connection to the default print server will be used.<br> <br> If "name" is <code>NULL</code>, the default printer for the current user will be returned.<br> <br> The returned destination must be freed using <a href="#cupsFreeDests"><code>cupsFreeDests</code></a> with a "num_dests" value of 1. </p> <h3 class="function"><a name="cupsGetOption">cupsGetOption</a></h3> <p class="description">Get an option value.</p> <p class="code"> const char *cupsGetOption (<br> const char *name,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> *options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Name of option</dd> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Options</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Option value or <code>NULL</code></p> <h3 class="function"><a name="cupsGetPPD">cupsGetPPD</a></h3> <p class="description">Get the PPD file for a printer on the default server.</p> <p class="code"> const char *cupsGetPPD (<br> const char *name<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Destination name</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Filename for PPD file</p> <h4 class="discussion">Discussion</h4> <p class="discussion">For classes, <code>cupsGetPPD</code> returns the PPD file for the first printer in the class.<br> <br> The returned filename is stored in a static buffer and is overwritten with each call to <code>cupsGetPPD</code> or <a href="#cupsGetPPD2"><code>cupsGetPPD2</code></a>. The caller "owns" the file that is created and must <code>unlink</code> the returned filename.</p> <h3 class="function"><span class="info"> CUPS 1.1.21/Mac OS X 10.4 </span><a name="cupsGetPPD2">cupsGetPPD2</a></h3> <p class="description">Get the PPD file for a printer from the specified server.</p> <p class="code"> const char *cupsGetPPD2 (<br> http_t *http,<br> const char *name<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Destination name</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Filename for PPD file</p> <h4 class="discussion">Discussion</h4> <p class="discussion">For classes, <code>cupsGetPPD2</code> returns the PPD file for the first printer in the class.<br> <br> The returned filename is stored in a static buffer and is overwritten with each call to <a href="#cupsGetPPD"><code>cupsGetPPD</code></a> or <code>cupsGetPPD2</code>. The caller "owns" the file that is created and must <code>unlink</code> the returned filename. </p> <h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsGetPPD3">cupsGetPPD3</a></h3> <p class="description">Get the PPD file for a printer on the specified server if it has changed.</p> <p class="code"> http_status_t cupsGetPPD3 (<br> http_t *http,<br> const char *name,<br> time_t *modtime,<br> char *buffer,<br> size_t bufsize<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">HTTP connection or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Destination name</dd> <dt>modtime</dt> <dd class="description">Modification time</dd> <dt>buffer</dt> <dd class="description">Filename buffer</dd> <dt>bufsize</dt> <dd class="description">Size of filename buffer</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">HTTP status</p> <h4 class="discussion">Discussion</h4> <p class="discussion">The "modtime" parameter contains the modification time of any locally-cached content and is updated with the time from the PPD file on the server.<br> <br> The "buffer" parameter contains the local PPD filename. If it contains the empty string, a new temporary file is created, otherwise the existing file will be overwritten as needed. The caller "owns" the file that is created and must <code>unlink</code> the returned filename.<br> <br> On success, <code>HTTP_OK</code> is returned for a new PPD file and <code>HTTP_NOT_MODIFIED</code> if the existing PPD file is up-to-date. Any other status is an error.<br> <br> For classes, <code>cupsGetPPD3</code> returns the PPD file for the first printer in the class. </p> <h3 class="function"><a name="cupsGetPassword">cupsGetPassword</a></h3> <p class="description">Get a password from the user.</p> <p class="code"> const char *cupsGetPassword (<br> const char *prompt<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>prompt</dt> <dd class="description">Prompt string</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Password</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Uses the current password callback function. Returns <code>NULL</code> if the user does not provide a password.<br> <br> Note: The current password callback function is tracked separately for each thread in a program. Multi-threaded programs that override the setting via the <a href="#cupsSetPasswordCB"><code>cupsSetPasswordCB</code></a> or <a href="#cupsSetPasswordCB2"><code>cupsSetPasswordCB2</code></a> functions need to do so in each thread for the same function to be used.</p> <h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsGetPassword2">cupsGetPassword2</a></h3> <p class="description">Get a password from the user using the advanced password callback.</p> <p class="code"> const char *cupsGetPassword2 (<br> const char *prompt,<br> http_t *http,<br> const char *method,<br> const char *resource<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>prompt</dt> <dd class="description">Prompt string</dd> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>method</dt> <dd class="description">Request method ("GET", "POST", "PUT")</dd> <dt>resource</dt> <dd class="description">Resource path</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Password</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Uses the current password callback function. Returns <code>NULL</code> if the user does not provide a password.<br> <br> Note: The current password callback function is tracked separately for each thread in a program. Multi-threaded programs that override the setting via the <a href="#cupsSetPasswordCB"><code>cupsSetPasswordCB</code></a> or <a href="#cupsSetPasswordCB2"><code>cupsSetPasswordCB2</code></a> functions need to do so in each thread for the same function to be used. </p> <h3 class="function"><span class="info"> DEPRECATED </span><a name="cupsGetPrinters">cupsGetPrinters</a></h3> <p class="description">Get a list of printers from the default server.</p> <p class="code"> int cupsGetPrinters (<br> char ***printers<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>printers</dt> <dd class="description">Printers</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Number of printers</p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function is deprecated - use <a href="#cupsGetDests"><code>cupsGetDests</code></a> instead. </p> <h3 class="function"><span class="info"> CUPS 1.3/Mac OS X 10.5 </span><a name="cupsGetServerPPD">cupsGetServerPPD</a></h3> <p class="description">Get an available PPD file from the server.</p> <p class="code"> char *cupsGetServerPPD (<br> http_t *http,<br> const char *name<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Name of PPD file ("ppd-name")</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Name of PPD file or <code>NULL</code> on error</p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function returns the named PPD file from the server. The list of available PPDs is provided by the IPP <code>CUPS_GET_PPDS</code> operation.<br> <br> You must remove (unlink) the PPD file when you are finished with it. The PPD filename is stored in a static location that will be overwritten on the next call to <a href="#cupsGetPPD"><code>cupsGetPPD</code></a>, <a href="#cupsGetPPD2"><code>cupsGetPPD2</code></a>, or <a href="#cupsGetServerPPD"><code>cupsGetServerPPD</code></a>. </p> <h3 class="function"><a name="cupsLangDefault">cupsLangDefault</a></h3> <p class="description">Return the default language.</p> <p class="code"> cups_lang_t *cupsLangDefault (void);</p> <h4 class="returnvalue">Return Value</h4> <p class="description">Language data</p> <h3 class="function"><a name="cupsLangEncoding">cupsLangEncoding</a></h3> <p class="description">Return the character encoding (us-ascii, etc.) for the given language.</p> <p class="code"> const char *cupsLangEncoding (<br> cups_lang_t *lang<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>lang</dt> <dd class="description">Language data</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Character encoding</p> <h3 class="function"><a name="cupsLangFlush">cupsLangFlush</a></h3> <p class="description">Flush all language data out of the cache.</p> <p class="code"> void cupsLangFlush (void);</p> <h3 class="function"><a name="cupsLangFree">cupsLangFree</a></h3> <p class="description">Free language data.</p> <p class="code"> void cupsLangFree (<br> cups_lang_t *lang<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>lang</dt> <dd class="description">Language to free</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">This does not actually free anything; use <a href="#cupsLangFlush"><code>cupsLangFlush</code></a> for that.</p> <h3 class="function"><a name="cupsLangGet">cupsLangGet</a></h3> <p class="description">Get a language.</p> <p class="code"> cups_lang_t *cupsLangGet (<br> const char *language<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>language</dt> <dd class="description">Language or locale</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Language data</p> <h3 class="function"><span class="info"> CUPS 1.2/Mac OS X 10.5 </span><a name="cupsNotifySubject">cupsNotifySubject</a></h3> <p class="description">Return the subject for the given notification message.</p> <p class="code"> char *cupsNotifySubject (<br> cups_lang_t *lang,<br> ipp_t *event<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>lang</dt> <dd class="description">Language data</dd> <dt>event</dt> <dd class="description">Event data</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Subject string or <code>NULL</code></p> <h4 class="discussion">Discussion</h4> <p class="discussion">The returned string must be freed by the caller using <code>free</code>. </p> <h3 class="function"><span class="info"> CUPS 1.2/Mac OS X 10.5 </span><a name="cupsNotifyText">cupsNotifyText</a></h3> <p class="description">Return the text for the given notification message.</p> <p class="code"> char *cupsNotifyText (<br> cups_lang_t *lang,<br> ipp_t *event<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>lang</dt> <dd class="description">Language data</dd> <dt>event</dt> <dd class="description">Event data</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Message text or <code>NULL</code></p> <h4 class="discussion">Discussion</h4> <p class="discussion">The returned string must be freed by the caller using <code>free</code>. </p> <h3 class="function"><a name="cupsParseOptions">cupsParseOptions</a></h3> <p class="description">Parse options from a command-line argument.</p> <p class="code"> int cupsParseOptions (<br> const char *arg,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> **options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>arg</dt> <dd class="description">Argument to parse</dd> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Options found</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Number of options found</p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function converts space-delimited name/value pairs according to the PAPI text option ABNF specification. Collection values ("name={a=... b=... c=...}") are stored with the curley brackets intact - use <code>cupsParseOptions</code> on the value to extract the collection attributes.</p> <h3 class="function"><a name="cupsPrintFile">cupsPrintFile</a></h3> <p class="description">Print a file to a printer or class on the default server.</p> <p class="code"> int cupsPrintFile (<br> const char *name,<br> const char *filename,<br> const char *title,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> *options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Destination name</dd> <dt>filename</dt> <dd class="description">File to print</dd> <dt>title</dt> <dd class="description">Title of job</dd> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Options</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Job ID or 0 on error</p> <h3 class="function"><span class="info"> CUPS 1.1.21/Mac OS X 10.4 </span><a name="cupsPrintFile2">cupsPrintFile2</a></h3> <p class="description">Print a file to a printer or class on the specified server.</p> <p class="code"> int cupsPrintFile2 (<br> http_t *http,<br> const char *name,<br> const char *filename,<br> const char *title,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> *options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server</dd> <dt>name</dt> <dd class="description">Destination name</dd> <dt>filename</dt> <dd class="description">File to print</dd> <dt>title</dt> <dd class="description">Title of job</dd> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Options</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Job ID or 0 on error</p> <h3 class="function"><a name="cupsPrintFiles">cupsPrintFiles</a></h3> <p class="description">Print one or more files to a printer or class on the default server.</p> <p class="code"> int cupsPrintFiles (<br> const char *name,<br> int num_files,<br> const char **files,<br> const char *title,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> *options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Destination name</dd> <dt>num_files</dt> <dd class="description">Number of files</dd> <dt>files</dt> <dd class="description">File(s) to print</dd> <dt>title</dt> <dd class="description">Title of job</dd> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Options</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Job ID or 0 on error</p> <h3 class="function"><span class="info"> CUPS 1.1.21/Mac OS X 10.4 </span><a name="cupsPrintFiles2">cupsPrintFiles2</a></h3> <p class="description">Print one or more files to a printer or class on the specified server.</p> <p class="code"> int cupsPrintFiles2 (<br> http_t *http,<br> const char *name,<br> int num_files,<br> const char **files,<br> const char *title,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> *options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Destination name</dd> <dt>num_files</dt> <dd class="description">Number of files</dd> <dt>files</dt> <dd class="description">File(s) to print</dd> <dt>title</dt> <dd class="description">Title of job</dd> <dt>num_options</dt> <dd class="description">Number of options</dd> <dt>options</dt> <dd class="description">Options</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Job ID or 0 on error</p> <h3 class="function"><span class="info"> CUPS 1.3/Mac OS X 10.5 </span><a name="cupsRemoveDest">cupsRemoveDest</a></h3> <p class="description">Remove a destination from the destination list.</p> <p class="code"> int cupsRemoveDest (<br> const char *name,<br> const char *instance,<br> int num_dests,<br> <a href="#cups_dest_t">cups_dest_t</a> **dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Destination name</dd> <dt>instance</dt> <dd class="description">Instance name or <code>NULL</code></dd> <dt>num_dests</dt> <dd class="description">Number of destinations</dd> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">New number of destinations</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Removing a destination/instance does not delete the class or printer queue, merely the lpoptions for that destination/instance. Use the <a href="#cupsSetDests"><code>cupsSetDests</code></a> or <a href="#cupsSetDests2"><code>cupsSetDests2</code></a> functions to save the new options for the user. </p> <h3 class="function"><span class="info"> CUPS 1.2/Mac OS X 10.5 </span><a name="cupsRemoveOption">cupsRemoveOption</a></h3> <p class="description">Remove an option from an option array.</p> <p class="code"> int cupsRemoveOption (<br> const char *name,<br> int num_options,<br> <a href="#cups_option_t">cups_option_t</a> **options<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Option name</dd> <dt>num_options</dt> <dd class="description">Current number of options</dd> <dt>options</dt> <dd class="description">Options</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">New number of options</p> <h3 class="function"><a name="cupsServer">cupsServer</a></h3> <p class="description">Return the hostname/address of the current server.</p> <p class="code"> const char *cupsServer (void);</p> <h4 class="returnvalue">Return Value</h4> <p class="description">Server name</p> <h4 class="discussion">Discussion</h4> <p class="discussion">The default server comes from the CUPS_SERVER environment variable, then the ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not set, the default is the local system - either "localhost" or a domain socket path.<br> <br> The returned value can be a fully-qualified hostname, a numeric IPv4 or IPv6 address, or a domain socket pathname.<br> <br> Note: The current server is tracked separately for each thread in a program. Multi-threaded programs that override the server via the <a href="#cupsSetServer"><code>cupsSetServer</code></a> function need to do so in each thread for the same server to be used.</p> <h3 class="function"><span class="info"> CUPS 1.5/Mac OS X 10.7 </span><a name="cupsSetClientCertCB">cupsSetClientCertCB</a></h3> <p class="description">Set the client certificate callback.</p> <p class="code"> void cupsSetClientCertCB (<br> <a href="#cups_client_cert_cb_t">cups_client_cert_cb_t</a> cb,<br> void *user_data<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>cb</dt> <dd class="description">Callback function</dd> <dt>user_data</dt> <dd class="description">User data pointer</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">Pass <code>NULL</code> to restore the default callback.<br> <br> Note: The current certificate callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do so in each thread for the same callback to be used. </p> <h3 class="function"><span class="info"> CUPS 1.5/Mac OS X 10.7 </span><a name="cupsSetCredentials">cupsSetCredentials</a></h3> <p class="description">Set the default credentials to be used for SSL/TLS connections.</p> <p class="code"> int cupsSetCredentials (<br> cups_array_t *credentials<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>credentials</dt> <dd class="description">Array of credentials</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Status of call (0 = success)</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Note: The default credentials are tracked separately for each thread in a program. Multi-threaded programs that override the setting need to do so in each thread for the same setting to be used. </p> <h3 class="function"><span class="info"> CUPS 1.3/Mac OS X 10.5 </span><a name="cupsSetDefaultDest">cupsSetDefaultDest</a></h3> <p class="description">Set the default destination.</p> <p class="code"> void cupsSetDefaultDest (<br> const char *name,<br> const char *instance,<br> int num_dests,<br> <a href="#cups_dest_t">cups_dest_t</a> *dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>name</dt> <dd class="description">Destination name</dd> <dt>instance</dt> <dd class="description">Instance name or <code>NULL</code></dd> <dt>num_dests</dt> <dd class="description">Number of destinations</dd> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h3 class="function"><a name="cupsSetDests">cupsSetDests</a></h3> <p class="description">Save the list of destinations for the default server.</p> <p class="code"> void cupsSetDests (<br> int num_dests,<br> <a href="#cups_dest_t">cups_dest_t</a> *dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>num_dests</dt> <dd class="description">Number of destinations</dd> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">This function saves the destinations to /etc/cups/lpoptions when run as root and ~/.cups/lpoptions when run as a normal user.</p> <h3 class="function"><span class="info"> CUPS 1.1.21/Mac OS X 10.4 </span><a name="cupsSetDests2">cupsSetDests2</a></h3> <p class="description">Save the list of destinations for the specified server.</p> <p class="code"> int cupsSetDests2 (<br> http_t *http,<br> int num_dests,<br> <a href="#cups_dest_t">cups_dest_t</a> *dests<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>num_dests</dt> <dd class="description">Number of destinations</dd> <dt>dests</dt> <dd class="description">Destinations</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">0 on success, -1 on error</p> <h4 class="discussion">Discussion</h4> <p class="discussion">This function saves the destinations to /etc/cups/lpoptions when run as root and ~/.cups/lpoptions when run as a normal user. </p> <h3 class="function"><a name="cupsSetEncryption">cupsSetEncryption</a></h3> <p class="description">Set the encryption preference.</p> <p class="code"> void cupsSetEncryption (<br> http_encryption_t e<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>e</dt> <dd class="description">New encryption preference</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">The default encryption setting comes from the CUPS_ENCRYPTION environment variable, then the ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not set, the default is <code>HTTP_ENCRYPT_IF_REQUESTED</code>.<br> <br> Note: The current encryption setting is tracked separately for each thread in a program. Multi-threaded programs that override the setting need to do so in each thread for the same setting to be used.</p> <h3 class="function"><a name="cupsSetPasswordCB">cupsSetPasswordCB</a></h3> <p class="description">Set the password callback for CUPS.</p> <p class="code"> void cupsSetPasswordCB (<br> <a href="#cups_password_cb_t">cups_password_cb_t</a> cb<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>cb</dt> <dd class="description">Callback function</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">Pass <code>NULL</code> to restore the default (console) password callback, which reads the password from the console. Programs should call either this function or <a href="#cupsSetPasswordCB2"><code>cupsSetPasswordCB2</code></a>, as only one callback can be registered by a program per thread.<br> <br> Note: The current password callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do so in each thread for the same callback to be used.</p> <h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsSetPasswordCB2">cupsSetPasswordCB2</a></h3> <p class="description">Set the advanced password callback for CUPS.</p> <p class="code"> void cupsSetPasswordCB2 (<br> <a href="#cups_password_cb2_t">cups_password_cb2_t</a> cb,<br> void *user_data<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>cb</dt> <dd class="description">Callback function</dd> <dt>user_data</dt> <dd class="description">User data pointer</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">Pass <code>NULL</code> to restore the default (console) password callback, which reads the password from the console. Programs should call either this function or <a href="#cupsSetPasswordCB2"><code>cupsSetPasswordCB2</code></a>, as only one callback can be registered by a program per thread.<br> <br> Note: The current password callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do so in each thread for the same callback to be used. </p> <h3 class="function"><a name="cupsSetServer">cupsSetServer</a></h3> <p class="description">Set the default server name and port.</p> <p class="code"> void cupsSetServer (<br> const char *server<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>server</dt> <dd class="description">Server name</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">The "server" string can be a fully-qualified hostname, a numeric IPv4 or IPv6 address, or a domain socket pathname. Hostnames and numeric IP addresses can be optionally followed by a colon and port number to override the default port 631, e.g. "hostname:8631". Pass <code>NULL</code> to restore the default server name and port.<br> <br> Note: The current server is tracked separately for each thread in a program. Multi-threaded programs that override the server need to do so in each thread for the same server to be used.</p> <h3 class="function"><span class="info"> CUPS 1.5/Mac OS X 10.7 </span><a name="cupsSetServerCertCB">cupsSetServerCertCB</a></h3> <p class="description">Set the server certificate callback.</p> <p class="code"> void cupsSetServerCertCB (<br> <a href="#cups_server_cert_cb_t">cups_server_cert_cb_t</a> cb,<br> void *user_data<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>cb</dt> <dd class="description">Callback function</dd> <dt>user_data</dt> <dd class="description">User data pointer</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">Pass <code>NULL</code> to restore the default callback.<br> <br> Note: The current credentials callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do so in each thread for the same callback to be used. </p> <h3 class="function"><a name="cupsSetUser">cupsSetUser</a></h3> <p class="description">Set the default user name.</p> <p class="code"> void cupsSetUser (<br> const char *user<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>user</dt> <dd class="description">User name</dd> </dl> <h4 class="discussion">Discussion</h4> <p class="discussion">Pass <code>NULL</code> to restore the default user name.<br> <br> Note: The current user name is tracked separately for each thread in a program. Multi-threaded programs that override the user name need to do so in each thread for the same user name to be used.</p> <h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsStartDocument">cupsStartDocument</a></h3> <p class="description">Add a document to a job created with cupsCreateJob().</p> <p class="code"> http_status_t cupsStartDocument (<br> http_t *http,<br> const char *name,<br> int job_id,<br> const char *docname,<br> const char *format,<br> int last_document<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>http</dt> <dd class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></dd> <dt>name</dt> <dd class="description">Destination name</dd> <dt>job_id</dt> <dd class="description">Job ID from <a href="#cupsCreateJob"><code>cupsCreateJob</code></a></dd> <dt>docname</dt> <dd class="description">Name of document</dd> <dt>format</dt> <dd class="description">MIME type or <code>CUPS_FORMAT_foo</code></dd> <dt>last_document</dt> <dd class="description">1 for last document in job, 0 otherwise</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">HTTP status of request</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Use <a href="#cupsWriteRequestData"><code>cupsWriteRequestData</code></a> to write data for the document and <a href="#cupsFinishDocument"><code>cupsFinishDocument</code></a> to finish the document and get the submission status.<br> <br> The MIME type constants <code>CUPS_FORMAT_AUTO</code>, <code>CUPS_FORMAT_PDF</code>, <code>CUPS_FORMAT_POSTSCRIPT</code>, <code>CUPS_FORMAT_RAW</code>, and <code>CUPS_FORMAT_TEXT</code> are provided for the "format" argument, although any supported MIME type string can be supplied. </p> <h3 class="function"><a name="cupsTempFd">cupsTempFd</a></h3> <p class="description">Creates a temporary file.</p> <p class="code"> int cupsTempFd (<br> char *filename,<br> int len<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>filename</dt> <dd class="description">Pointer to buffer</dd> <dt>len</dt> <dd class="description">Size of buffer</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">New file descriptor or -1 on error</p> <h4 class="discussion">Discussion</h4> <p class="discussion">The temporary filename is returned in the filename buffer. The temporary file is opened for reading and writing.</p> <h3 class="function"><span class="info"> DEPRECATED </span><a name="cupsTempFile">cupsTempFile</a></h3> <p class="description">Generates a temporary filename.</p> <p class="code"> char *cupsTempFile (<br> char *filename,<br> int len<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>filename</dt> <dd class="description">Pointer to buffer</dd> <dt>len</dt> <dd class="description">Size of buffer</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">Filename or <code>NULL</code> on error</p> <h4 class="discussion">Discussion</h4> <p class="discussion">The temporary filename is returned in the filename buffer. This function is deprecated - use <a href="#cupsTempFd"><code>cupsTempFd</code></a> or <a href="#cupsTempFile2"><code>cupsTempFile2</code></a> instead. </p> <h3 class="function"><span class="info"> CUPS 1.2/Mac OS X 10.5 </span><a name="cupsTempFile2">cupsTempFile2</a></h3> <p class="description">Creates a temporary CUPS file.</p> <p class="code"> cups_file_t *cupsTempFile2 (<br> char *filename,<br> int len<br> );</p> <h4 class="parameters">Parameters</h4> <dl> <dt>filename</dt> <dd class="description">Pointer to buffer</dd> <dt>len</dt> <dd class="description">Size of buffer</dd> </dl> <h4 class="returnvalue">Return Value</h4> <p class="description">CUPS file or <code>NULL</code> on error</p> <h4 class="discussion">Discussion</h4> <p class="discussion">The temporary filename is returned in the filename buffer. The temporary file is opened for writing. </p> <h3 class="function"><a name="cupsUser">cupsUser</a></h3> <p class="description">Return the current user's name.</p> <p class="code"> const char *cupsUser (void);</p> <h4 class="returnvalue">Return Value</h4> <p class="description">User name</p> <h4 class="discussion">Discussion</h4> <p class="discussion">Note: The current user name is tracked separately for each thread in a program. Multi-threaded programs that override the user name with the <a href="#cupsSetUser"><code>cupsSetUser</code></a> function need to do so in each thread for the same user name to be used.</p> <h2 class="title"><a name="TYPES">Data Types</a></h2> <h3 class="typedef"><span class="info"> CUPS 1.5/Mac OS X 10.7 </span><a name="cups_client_cert_cb_t">cups_client_cert_cb_t</a></h3> <p class="description">Client credentials callback </p> <p class="code"> typedef int (*cups_client_cert_cb_t)(http_t *http, void *tls, cups_array_t *distinguished_names, void *user_data); </p> <h3 class="typedef"><a name="cups_dest_t">cups_dest_t</a></h3> <p class="description">Destination</p> <p class="code"> typedef struct <a href="#cups_dest_s">cups_dest_s</a> cups_dest_t; </p> <h3 class="typedef"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cups_device_cb_t">cups_device_cb_t</a></h3> <p class="description">Device callback </p> <p class="code"> typedef void (*cups_device_cb_t)(const char *device_class, const char *device_id, const char *device_info, const char *device_make_and_model, const char *device_uri, const char *device_location, void *user_data); </p> <h3 class="typedef"><a name="cups_job_t">cups_job_t</a></h3> <p class="description">Job</p> <p class="code"> typedef struct <a href="#cups_job_s">cups_job_s</a> cups_job_t; </p> <h3 class="typedef"><a name="cups_option_t">cups_option_t</a></h3> <p class="description">Printer Options</p> <p class="code"> typedef struct <a href="#cups_option_s">cups_option_s</a> cups_option_t; </p> <h3 class="typedef"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cups_password_cb2_t">cups_password_cb2_t</a></h3> <p class="description">New password callback </p> <p class="code"> typedef const char *(*cups_password_cb2_t)(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data); </p> <h3 class="typedef"><a name="cups_password_cb_t">cups_password_cb_t</a></h3> <p class="description">Password callback</p> <p class="code"> typedef const char *(*cups_password_cb_t)(const char *prompt); </p> <h3 class="typedef"><a name="cups_ptype_t">cups_ptype_t</a></h3> <p class="description">Printer type/capability bits</p> <p class="code"> typedef unsigned cups_ptype_t; </p> <h3 class="typedef"><span class="info"> CUPS 1.5/Mac OS X 10.7 </span><a name="cups_server_cert_cb_t">cups_server_cert_cb_t</a></h3> <p class="description">Server credentials callback </p> <p class="code"> typedef int (*cups_server_cert_cb_t)(http_t *http, void *tls, cups_array_t *certs, void *user_data); </p> <h2 class="title"><a name="STRUCTURES">Structures</a></h2> <h3 class="struct"><a name="cups_dest_s">cups_dest_s</a></h3> <p class="description">Destination</p> <p class="code">struct cups_dest_s {<br> char *name, *instance;<br> int is_default;<br> int num_options;<br> <a href="#cups_option_t">cups_option_t</a> *options;<br> };</p> <h4 class="members">Members</h4> <dl> <dt>instance </dt> <dd class="description">Local instance name or NULL</dd> <dt>is_default </dt> <dd class="description">Is this printer the default?</dd> <dt>num_options </dt> <dd class="description">Number of options</dd> <dt>options </dt> <dd class="description">Options</dd> </dl> <h3 class="struct"><a name="cups_job_s">cups_job_s</a></h3> <p class="description">Job</p> <p class="code">struct cups_job_s {<br> time_t completed_time;<br> time_t creation_time;<br> char *dest;<br> char *format;<br> int id;<br> int priority;<br> time_t processing_time;<br> int size;<br> ipp_jstate_t state;<br> char *title;<br> char *user;<br> };</p> <h4 class="members">Members</h4> <dl> <dt>completed_time </dt> <dd class="description">Time the job was completed</dd> <dt>creation_time </dt> <dd class="description">Time the job was created</dd> <dt>dest </dt> <dd class="description">Printer or class name</dd> <dt>format </dt> <dd class="description">Document format</dd> <dt>id </dt> <dd class="description">The job ID</dd> <dt>priority </dt> <dd class="description">Priority (1-100)</dd> <dt>processing_time </dt> <dd class="description">Time the job was processed</dd> <dt>size </dt> <dd class="description">Size in kilobytes</dd> <dt>state </dt> <dd class="description">Job state</dd> <dt>title </dt> <dd class="description">Title/job name</dd> <dt>user </dt> <dd class="description">User the submitted the job</dd> </dl> <h3 class="struct"><a name="cups_option_s">cups_option_s</a></h3> <p class="description">Printer Options</p> <p class="code">struct cups_option_s {<br> char *name;<br> char *value;<br> };</p> <h4 class="members">Members</h4> <dl> <dt>name </dt> <dd class="description">Name of option</dd> <dt>value </dt> <dd class="description">Value of option</dd> </dl> <h2 class="title"><a name="VARIABLES">Variables</a></h2> <h3 class="variable"><a name="CF_RETURNS_RETAINED">CF_RETURNS_RETAINED</a></h3> <p class="description">Get the Apple language identifier associated with a locale ID.</p> <p class="code">const char *locale) CF_RETURNS_RETAINED;</p> <h2 class="title"><a name="ENUMERATIONS">Constants</a></h2> <h3 class="enumeration"><a name="cups_ptype_e">cups_ptype_e</a></h3> <p class="description">Printer type/capability bit constants</p> <h4 class="constants">Constants</h4> <dl> <dt>CUPS_PRINTER_AUTHENTICATED <span class="info"> CUPS 1.2/Mac OS X 10.5 </span></dt> <dd class="description">Printer requires authentication </dd> <dt>CUPS_PRINTER_BIND </dt> <dd class="description">Can bind output</dd> <dt>CUPS_PRINTER_BW </dt> <dd class="description">Can do B&W printing</dd> <dt>CUPS_PRINTER_CLASS </dt> <dd class="description">Printer class</dd> <dt>CUPS_PRINTER_COLLATE </dt> <dd class="description">Can collage copies</dd> <dt>CUPS_PRINTER_COLOR </dt> <dd class="description">Can do color printing</dd> <dt>CUPS_PRINTER_COMMANDS <span class="info"> CUPS 1.2/Mac OS X 10.5 </span></dt> <dd class="description">Printer supports maintenance commands </dd> <dt>CUPS_PRINTER_COPIES </dt> <dd class="description">Can do copies</dd> <dt>CUPS_PRINTER_COVER </dt> <dd class="description">Can cover output</dd> <dt>CUPS_PRINTER_DEFAULT </dt> <dd class="description">Default printer on network</dd> <dt>CUPS_PRINTER_DELETE <span class="info"> CUPS 1.2/Mac OS X 10.5 </span></dt> <dd class="description">Delete printer </dd> <dt>CUPS_PRINTER_DISCOVERED <span class="info"> CUPS 1.3/Mac OS X 10.5 </span></dt> <dd class="description">Printer was automatically discovered and added </dd> <dt>CUPS_PRINTER_DUPLEX </dt> <dd class="description">Can do duplexing</dd> <dt>CUPS_PRINTER_FAX </dt> <dd class="description">Fax queue</dd> <dt>CUPS_PRINTER_IMPLICIT </dt> <dd class="description">Implicit class</dd> <dt>CUPS_PRINTER_LARGE </dt> <dd class="description">Can do D/E/A1/A0</dd> <dt>CUPS_PRINTER_LOCAL </dt> <dd class="description">Local printer or class</dd> <dt>CUPS_PRINTER_MEDIUM </dt> <dd class="description">Can do Tabloid/B/C/A3/A2</dd> <dt>CUPS_PRINTER_MFP <span class="info"> CUPS 1.4/Mac OS X 10.6 </span></dt> <dd class="description">Printer with scanning capabilities </dd> <dt>CUPS_PRINTER_NOT_SHARED <span class="info"> CUPS 1.2/Mac OS X 10.5 </span></dt> <dd class="description">Printer is not shared </dd> <dt>CUPS_PRINTER_PUNCH </dt> <dd class="description">Can punch output</dd> <dt>CUPS_PRINTER_REJECTING </dt> <dd class="description">Printer is rejecting jobs</dd> <dt>CUPS_PRINTER_REMOTE </dt> <dd class="description">Remote printer or class</dd> <dt>CUPS_PRINTER_SCANNER <span class="info"> CUPS 1.4/Mac OS X 10.6 </span></dt> <dd class="description">Scanner-only device </dd> <dt>CUPS_PRINTER_SMALL </dt> <dd class="description">Can do Letter/Legal/A4</dd> <dt>CUPS_PRINTER_SORT </dt> <dd class="description">Can sort output</dd> <dt>CUPS_PRINTER_STAPLE </dt> <dd class="description">Can staple output</dd> <dt>CUPS_PRINTER_VARIABLE </dt> <dd class="description">Can do variable sizes</dd> </dl> </div> </body> </html>