]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Update documentation.
authorMichael R Sweet <msweet@msweet.org>
Thu, 5 Oct 2023 15:55:02 +0000 (11:55 -0400)
committerMichael R Sweet <msweet@msweet.org>
Wed, 27 Dec 2023 03:12:38 +0000 (22:12 -0500)
cups/cupspm.md
doc/help/api-admin.html
doc/help/api-ppd.html
doc/help/cupspm.epub
doc/help/cupspm.html

index c55d2f124ff21b58f68eb4b7d93243239b5d2c27..d963d42a21037c61a24b2d63e805f69cd3579504 100644 (file)
@@ -2,7 +2,7 @@
 title: CUPS Programming Manual
 author: Michael R Sweet
 copyright: Copyright © 2021-2023 by OpenPrinting. All Rights Reserved.
-version: 2.4.0
+version: 2.5.0
 ...
 
 > Please [file issues on GitHub](https://github.com/openprinting/cups/issues) to
@@ -158,31 +158,31 @@ The `type` and `mask` arguments are bitfields that allow the caller to filter
 the destinations based on categories and/or capabilities.  The destination's
 "printer-type" value is masked by the `mask` value and compared to the `type`
 value when filtering.  For example, to only enumerate destinations that are
-hosted on the local system, pass `CUPS_PRINTER_LOCAL` for the `type` argument
-and `CUPS_PRINTER_DISCOVERED` for the `mask` argument.  The following constants
+hosted on the local system, pass `CUPS_PTYPE_LOCAL` for the `type` argument
+and `CUPS_PTYPE_DISCOVERED` for the `mask` argument.  The following constants
 can be used for filtering:
 
-- `CUPS_PRINTER_CLASS`: A collection of destinations.
-- `CUPS_PRINTER_FAX`: A facsimile device.
-- `CUPS_PRINTER_LOCAL`: A local printer or class.  This constant has the value 0
+- `CUPS_PTYPE_CLASS`: A collection of destinations.
+- `CUPS_PTYPE_FAX`: A facsimile device.
+- `CUPS_PTYPE_LOCAL`: A local printer or class.  This constant has the value 0
   (no bits set) and is only used for the `type` argument and is paired with the
-  `CUPS_PRINTER_REMOTE` or `CUPS_PRINTER_DISCOVERED` constant passed in the
+  `CUPS_PTYPE_REMOTE` or `CUPS_PTYPE_DISCOVERED` constant passed in the
   `mask` argument.
-- `CUPS_PRINTER_REMOTE`: A remote (shared) printer or class.
-- `CUPS_PRINTER_DISCOVERED`: An available network printer or class.
-- `CUPS_PRINTER_BW`: Can do B&W printing.
-- `CUPS_PRINTER_COLOR`: Can do color printing.
-- `CUPS_PRINTER_DUPLEX`: Can do two-sided printing.
-- `CUPS_PRINTER_STAPLE`: Can staple output.
-- `CUPS_PRINTER_COLLATE`: Can quickly collate copies.
-- `CUPS_PRINTER_PUNCH`: Can punch output.
-- `CUPS_PRINTER_COVER`: Can cover output.
-- `CUPS_PRINTER_BIND`: Can bind output.
-- `CUPS_PRINTER_SORT`: Can sort output (mailboxes, etc.)
-- `CUPS_PRINTER_SMALL`: Can print on Letter/Legal/A4-size media.
-- `CUPS_PRINTER_MEDIUM`: Can print on Tabloid/B/C/A3/A2-size media.
-- `CUPS_PRINTER_LARGE`: Can print on D/E/A1/A0-size media.
-- `CUPS_PRINTER_VARIABLE`: Can print on rolls and custom-size media.
+- `CUPS_PTYPE_REMOTE`: A remote (shared) printer or class.
+- `CUPS_PTYPE_DISCOVERED`: An available network printer or class.
+- `CUPS_PTYPE_BW`: Can do B&W printing.
+- `CUPS_PTYPE_COLOR`: Can do color printing.
+- `CUPS_PTYPE_DUPLEX`: Can do two-sided printing.
+- `CUPS_PTYPE_STAPLE`: Can staple output.
+- `CUPS_PTYPE_COLLATE`: Can quickly collate copies.
+- `CUPS_PTYPE_PUNCH`: Can punch output.
+- `CUPS_PTYPE_COVER`: Can cover output.
+- `CUPS_PTYPE_BIND`: Can bind output.
+- `CUPS_PTYPE_SORT`: Can sort output (mailboxes, etc.)
+- `CUPS_PTYPE_SMALL`: Can print on Letter/Legal/A4-size media.
+- `CUPS_PTYPE_MEDIUM`: Can print on Tabloid/B/C/A3/A2-size media.
+- `CUPS_PTYPE_LARGE`: Can print on D/E/A1/A0-size media.
+- `CUPS_PTYPE_VARIABLE`: Can print on rolls and custom-size media.
 
 The `cb` argument specifies a function to call for every destination that is
 found:
index d5e9ff5ab49a722a8203e07931646df331c7a2b9..aedbdc34debc04b116be447039e1788f24159fe6 100644 (file)
@@ -499,8 +499,7 @@ being provided by the <a href="#cupsEnumDests"><code>cupsEnumDests</code></a> an
 </p>
 <h2 class="title"><a id="TYPES">Data Types</a></h2>
 <h3 class="typedef"><a id="cups_device_cb_t"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span>cups_device_cb_t</a></h3>
-<p class="description">Device callback
-</p>
+<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>
index 8873a6cd55bd7f3b2d22b1a3fd45352e3dd770f2..b9fca20d587945a1d90b63471c06080ee20d1b13 100644 (file)
@@ -340,43 +340,20 @@ span.string {
 <li><a href="#ppd_attr_t">ppd_attr_t</a></li>
 <li><a href="#ppd_choice_t">ppd_choice_t</a></li>
 <li><a href="#ppd_conform_t">ppd_conform_t</a></li>
-<li><a href="#ppd_const_t">ppd_const_t</a></li>
-<li><a href="#ppd_coption_t">ppd_coption_t</a></li>
-<li><a href="#ppd_cparam_t">ppd_cparam_t</a></li>
-<li><a href="#ppd_cplimit_t">ppd_cplimit_t</a></li>
-<li><a href="#ppd_cptype_t">ppd_cptype_t</a></li>
-<li><a href="#ppd_cpvalue_t">ppd_cpvalue_t</a></li>
 <li><a href="#ppd_cs_t">ppd_cs_t</a></li>
-<li><a href="#ppd_emul_t">ppd_emul_t</a></li>
-<li><a href="#ppd_file_t">ppd_file_t</a></li>
-<li><a href="#ppd_group_t">ppd_group_t</a></li>
 <li><a href="#ppd_option_t">ppd_option_t</a></li>
-<li><a href="#ppd_profile_t">ppd_profile_t</a></li>
 <li><a href="#ppd_section_t">ppd_section_t</a></li>
-<li><a href="#ppd_size_t">ppd_size_t</a></li>
 <li><a href="#ppd_status_t">ppd_status_t</a></li>
 <li><a href="#ppd_ui_t">ppd_ui_t</a></li>
 </ul></li>
 <li><a href="#STRUCTURES">Structures</a><ul class="subcontents">
 <li><a href="#ppd_attr_s">ppd_attr_s</a></li>
 <li><a href="#ppd_choice_s">ppd_choice_s</a></li>
-<li><a href="#ppd_const_s">ppd_const_s</a></li>
-<li><a href="#ppd_coption_s">ppd_coption_s</a></li>
-<li><a href="#ppd_cparam_s">ppd_cparam_s</a></li>
-<li><a href="#ppd_emul_s">ppd_emul_s</a></li>
-<li><a href="#ppd_file_s">ppd_file_s</a></li>
 <li><a href="#ppd_group_s">ppd_group_s</a></li>
 <li><a href="#ppd_option_s">ppd_option_s</a></li>
-<li><a href="#ppd_profile_s">ppd_profile_s</a></li>
-<li><a href="#ppd_size_s">ppd_size_s</a></li>
-</ul></li>
-<li><a href="#UNIONS">Unions</a><ul class="subcontents">
-<li><a href="#ppd_cplimit_u">ppd_cplimit_u</a></li>
-<li><a href="#ppd_cpvalue_u">ppd_cpvalue_u</a></li>
 </ul></li>
 <li><a href="#ENUMERATIONS">Enumerations</a><ul class="subcontents">
 <li><a href="#ppd_conform_e">ppd_conform_e</a></li>
-<li><a href="#ppd_cptype_e">ppd_cptype_e</a></li>
 <li><a href="#ppd_cs_e">ppd_cs_e</a></li>
 <li><a href="#ppd_section_e">ppd_section_e</a></li>
 <li><a href="#ppd_status_e">ppd_status_e</a></li>
@@ -610,7 +587,7 @@ for (attr = <a href="#ppdFindAttr">ppdFindAttr</a>(ppd, "Product", NULL);
 <h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsGetConflicts">cupsGetConflicts</a></h3>
 <p class="description">Get a list of conflicting options in a marked PPD.</p>
 <p class="code">
-int cupsGetConflicts(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option, const char *choice, cups_option_t **options);</p>
+int cupsGetConflicts(ppd_file_t *ppd, const char *option, const char *choice, cups_option_t **options);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -677,7 +654,7 @@ file that is created and must <code>unlink</code> the returned filename.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsGetPPD3">cupsGetPPD3</a></h3>
 <p class="description">Get the PPD file for a printer on the specified
-server if it has changed.</p>
+                  server if it has changed.</p>
 <p class="code">
 http_status_t cupsGetPPD3(http_t *http, const char *name, time_t *modtime, char *buffer, size_t bufsize);</p>
 <h4 class="parameters">Parameters</h4>
@@ -740,7 +717,7 @@ or <a href="#cupsGetServerPPD"><code>cupsGetServerPPD</code></a>.
 <h3 class="function"><a id="cupsMarkOptions">cupsMarkOptions</a></h3>
 <p class="description">Mark command-line options in a PPD file.</p>
 <p class="code">
-int cupsMarkOptions(<a href="#ppd_file_t">ppd_file_t</a> *ppd, int num_options, cups_option_t *options);</p>
+int cupsMarkOptions(ppd_file_t *ppd, int num_options, cups_option_t *options);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -760,7 +737,7 @@ corresponding PPD options and choices.</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsRasterInterpretPPD">cupsRasterInterpretPPD</a></h3>
 <p class="description">Interpret PPD commands to create a page header.</p>
 <p class="code">
-int cupsRasterInterpretPPD(cups_page_header2_t *h, <a href="#ppd_file_t">ppd_file_t</a> *ppd, int num_options, cups_option_t *options, <a href="#cups_interpret_cb_t">cups_interpret_cb_t</a> func);</p>
+int cupsRasterInterpretPPD(cups_page_header2_t *h, ppd_file_t *ppd, int num_options, cups_option_t *options, <a href="#cups_interpret_cb_t">cups_interpret_cb_t</a> func);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>h</th>
@@ -805,7 +782,7 @@ are supported.
 <h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsResolveConflicts">cupsResolveConflicts</a></h3>
 <p class="description">Resolve conflicts in a marked PPD.</p>
 <p class="code">
-int cupsResolveConflicts(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option, const char *choice, int *num_options, cups_option_t **options);</p>
+int cupsResolveConflicts(ppd_file_t *ppd, const char *option, const char *choice, int *num_options, cups_option_t **options);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -856,9 +833,9 @@ until a non-conflicting option choice is found.
 </p>
 <h3 class="function"><a id="ppdCollect">ppdCollect</a></h3>
 <p class="description">Collect all marked options that reside in the specified
-section.</p>
+                 section.</p>
 <p class="code">
-int ppdCollect(<a href="#ppd_file_t">ppd_file_t</a> *ppd, <a href="#ppd_section_t">ppd_section_t</a> section, <a href="#ppd_choice_t">ppd_choice_t</a> ***choices);</p>
+int ppdCollect(ppd_file_t *ppd, <a href="#ppd_section_t">ppd_section_t</a> section, <a href="#ppd_choice_t">ppd_choice_t</a> ***choices);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -875,9 +852,9 @@ int ppdCollect(<a href="#ppd_file_t">ppd_file_t</a> *ppd, <a href="#ppd_section_
 finished with it.</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdCollect2">ppdCollect2</a></h3>
 <p class="description">Collect all marked options that reside in the
-specified section and minimum order.</p>
+                  specified section and minimum order.</p>
 <p class="code">
-int ppdCollect2(<a href="#ppd_file_t">ppd_file_t</a> *ppd, <a href="#ppd_section_t">ppd_section_t</a> section, float min_order, <a href="#ppd_choice_t">ppd_choice_t</a> ***choices);</p>
+int ppdCollect2(ppd_file_t *ppd, <a href="#ppd_section_t">ppd_section_t</a> section, float min_order, <a href="#ppd_choice_t">ppd_choice_t</a> ***choices);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -898,9 +875,9 @@ finished with it.
 </p>
 <h3 class="function"><a id="ppdConflicts">ppdConflicts</a></h3>
 <p class="description">Check to see if there are any conflicts among the
-marked option choices.</p>
+                   marked option choices.</p>
 <p class="code">
-int ppdConflicts(<a href="#ppd_file_t">ppd_file_t</a> *ppd);</p>
+int ppdConflicts(ppd_file_t *ppd);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -913,7 +890,7 @@ int ppdConflicts(<a href="#ppd_file_t">ppd_file_t</a> *ppd);</p>
 <h3 class="function"><a id="ppdEmit">ppdEmit</a></h3>
 <p class="description">Emit code for marked options to a file.</p>
 <p class="code">
-int ppdEmit(<a href="#ppd_file_t">ppd_file_t</a> *ppd, FILE *fp, <a href="#ppd_section_t">ppd_section_t</a> section);</p>
+int ppdEmit(ppd_file_t *ppd, FILE *fp, <a href="#ppd_section_t">ppd_section_t</a> section);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -928,7 +905,7 @@ int ppdEmit(<a href="#ppd_file_t">ppd_file_t</a> *ppd, FILE *fp, <a href="#ppd_s
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdEmitAfterOrder">ppdEmitAfterOrder</a></h3>
 <p class="description">Emit a subset of the code for marked options to a file.</p>
 <p class="code">
-int ppdEmitAfterOrder(<a href="#ppd_file_t">ppd_file_t</a> *ppd, FILE *fp, <a href="#ppd_section_t">ppd_section_t</a> section, int limit, float min_order);</p>
+int ppdEmitAfterOrder(ppd_file_t *ppd, FILE *fp, <a href="#ppd_section_t">ppd_section_t</a> section, int limit, float min_order);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -954,7 +931,7 @@ When &quot;limit&quot; is zero, this function is identical to ppdEmit().
 <h3 class="function"><a id="ppdEmitFd">ppdEmitFd</a></h3>
 <p class="description">Emit code for marked options to a file.</p>
 <p class="code">
-int ppdEmitFd(<a href="#ppd_file_t">ppd_file_t</a> *ppd, int fd, <a href="#ppd_section_t">ppd_section_t</a> section);</p>
+int ppdEmitFd(ppd_file_t *ppd, int fd, <a href="#ppd_section_t">ppd_section_t</a> section);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -969,7 +946,7 @@ int ppdEmitFd(<a href="#ppd_file_t">ppd_file_t</a> *ppd, int fd, <a href="#ppd_s
 <h3 class="function"><a id="ppdEmitJCL">ppdEmitJCL</a></h3>
 <p class="description">Emit code for JCL options to a file.</p>
 <p class="code">
-int ppdEmitJCL(<a href="#ppd_file_t">ppd_file_t</a> *ppd, FILE *fp, int job_id, const char *user, const char *title);</p>
+int ppdEmitJCL(ppd_file_t *ppd, FILE *fp, int job_id, const char *user, const char *title);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -988,7 +965,7 @@ int ppdEmitJCL(<a href="#ppd_file_t">ppd_file_t</a> *ppd, FILE *fp, int job_id,
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdEmitJCLEnd">ppdEmitJCLEnd</a></h3>
 <p class="description">Emit JCLEnd code to a file.</p>
 <p class="code">
-int ppdEmitJCLEnd(<a href="#ppd_file_t">ppd_file_t</a> *ppd, FILE *fp);</p>
+int ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1001,7 +978,7 @@ int ppdEmitJCLEnd(<a href="#ppd_file_t">ppd_file_t</a> *ppd, FILE *fp);</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdEmitString">ppdEmitString</a></h3>
 <p class="description">Get a string containing the code for marked options.</p>
 <p class="code">
-char *ppdEmitString(<a href="#ppd_file_t">ppd_file_t</a> *ppd, <a href="#ppd_section_t">ppd_section_t</a> section, float min_order);</p>
+char *ppdEmitString(ppd_file_t *ppd, <a href="#ppd_section_t">ppd_section_t</a> section, float min_order);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1026,7 +1003,7 @@ The return string is allocated on the heap and should be freed using
 <h3 class="function"><span class="info">&#160;CUPS 1.1.19/macOS 10.3&#160;</span><a id="ppdFindAttr">ppdFindAttr</a></h3>
 <p class="description">Find the first matching attribute.</p>
 <p class="code">
-<a href="#ppd_attr_t">ppd_attr_t</a> *ppdFindAttr(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *name, const char *spec);</p>
+<a href="#ppd_attr_t">ppd_attr_t</a> *ppdFindAttr(ppd_file_t *ppd, const char *name, const char *spec);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1054,7 +1031,7 @@ The return string is allocated on the heap and should be freed using
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdFindCustomOption">ppdFindCustomOption</a></h3>
 <p class="description">Find a custom option.</p>
 <p class="code">
-<a href="#ppd_coption_t">ppd_coption_t</a> *ppdFindCustomOption(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *keyword);</p>
+ppd_coption_t *ppdFindCustomOption(ppd_file_t *ppd, const char *keyword);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1067,7 +1044,7 @@ The return string is allocated on the heap and should be freed using
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdFindCustomParam">ppdFindCustomParam</a></h3>
 <p class="description">Find a parameter for a custom option.</p>
 <p class="code">
-<a href="#ppd_cparam_t">ppd_cparam_t</a> *ppdFindCustomParam(<a href="#ppd_coption_t">ppd_coption_t</a> *opt, const char *name);</p>
+ppd_cparam_t *ppdFindCustomParam(ppd_coption_t *opt, const char *name);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>opt</th>
@@ -1080,7 +1057,7 @@ The return string is allocated on the heap and should be freed using
 <h3 class="function"><a id="ppdFindMarkedChoice">ppdFindMarkedChoice</a></h3>
 <p class="description">Return the marked choice for the specified option.</p>
 <p class="code">
-<a href="#ppd_choice_t">ppd_choice_t</a> *ppdFindMarkedChoice(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option);</p>
+<a href="#ppd_choice_t">ppd_choice_t</a> *ppdFindMarkedChoice(ppd_file_t *ppd, const char *option);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1093,7 +1070,7 @@ The return string is allocated on the heap and should be freed using
 <h3 class="function"><span class="info">&#160;CUPS 1.1.19/macOS 10.3&#160;</span><a id="ppdFindNextAttr">ppdFindNextAttr</a></h3>
 <p class="description">Find the next matching attribute.</p>
 <p class="code">
-<a href="#ppd_attr_t">ppd_attr_t</a> *ppdFindNextAttr(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *name, const char *spec);</p>
+<a href="#ppd_attr_t">ppd_attr_t</a> *ppdFindNextAttr(ppd_file_t *ppd, const char *name, const char *spec);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1108,7 +1085,7 @@ The return string is allocated on the heap and should be freed using
 <h3 class="function"><a id="ppdFindOption">ppdFindOption</a></h3>
 <p class="description">Return a pointer to the specified option.</p>
 <p class="code">
-<a href="#ppd_option_t">ppd_option_t</a> *ppdFindOption(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option);</p>
+<a href="#ppd_option_t">ppd_option_t</a> *ppdFindOption(ppd_file_t *ppd, const char *option);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1121,7 +1098,7 @@ The return string is allocated on the heap and should be freed using
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdFirstCustomParam">ppdFirstCustomParam</a></h3>
 <p class="description">Return the first parameter for a custom option.</p>
 <p class="code">
-<a href="#ppd_cparam_t">ppd_cparam_t</a> *ppdFirstCustomParam(<a href="#ppd_coption_t">ppd_coption_t</a> *opt);</p>
+ppd_cparam_t *ppdFirstCustomParam(ppd_coption_t *opt);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>opt</th>
@@ -1132,7 +1109,7 @@ The return string is allocated on the heap and should be freed using
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdFirstOption">ppdFirstOption</a></h3>
 <p class="description">Return the first option in the PPD file.</p>
 <p class="code">
-<a href="#ppd_option_t">ppd_option_t</a> *ppdFirstOption(<a href="#ppd_file_t">ppd_file_t</a> *ppd);</p>
+<a href="#ppd_option_t">ppd_option_t</a> *ppdFirstOption(ppd_file_t *ppd);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1146,9 +1123,9 @@ The return string is allocated on the heap and should be freed using
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="ppdInstallableConflict">ppdInstallableConflict</a></h3>
 <p class="description">Test whether an option choice conflicts with
-an installable option.</p>
+                             an installable option.</p>
 <p class="code">
-int ppdInstallableConflict(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option, const char *choice);</p>
+int ppdInstallableConflict(ppd_file_t *ppd, const char *option, const char *choice);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1168,7 +1145,7 @@ on constraints against options in the &quot;InstallableOptions&quot; group.
 <h3 class="function"><a id="ppdIsMarked">ppdIsMarked</a></h3>
 <p class="description">Check to see if an option is marked.</p>
 <p class="code">
-int ppdIsMarked(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option, const char *choice);</p>
+int ppdIsMarked(ppd_file_t *ppd, const char *option, const char *choice);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1183,7 +1160,7 @@ int ppdIsMarked(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option, c
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdLocalize">ppdLocalize</a></h3>
 <p class="description">Localize the PPD file to the current locale.</p>
 <p class="code">
-int ppdLocalize(<a href="#ppd_file_t">ppd_file_t</a> *ppd);</p>
+int ppdLocalize(ppd_file_t *ppd);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1200,7 +1177,7 @@ localized string uses the UTF-8 character encoding.
 <h3 class="function"><a id="ppdLocalizeAttr">ppdLocalizeAttr</a></h3>
 <p class="description">Localize an attribute.</p>
 <p class="code">
-<a href="#ppd_attr_t">ppd_attr_t</a> *ppdLocalizeAttr(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *keyword, const char *spec);</p>
+<a href="#ppd_attr_t">ppd_attr_t</a> *ppdLocalizeAttr(ppd_file_t *ppd, const char *keyword, const char *spec);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1218,9 +1195,9 @@ the given main and option keywords.  If no localized version of the
 attribute exists for the current locale, the unlocalized version is returned.</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.3/macOS 10.5&#160;</span><a id="ppdLocalizeIPPReason">ppdLocalizeIPPReason</a></h3>
 <p class="description">Get the localized version of a cupsIPPReason
-attribute.</p>
+                           attribute.</p>
 <p class="code">
-const char *ppdLocalizeIPPReason(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *reason, const char *scheme, char *buffer, size_t bufsize);</p>
+const char *ppdLocalizeIPPReason(ppd_file_t *ppd, const char *reason, const char *scheme, char *buffer, size_t bufsize);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1247,9 +1224,9 @@ If no value of the requested scheme can be found, NULL is returned.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="ppdLocalizeMarkerName">ppdLocalizeMarkerName</a></h3>
 <p class="description">Get the localized version of a marker-names
-attribute value.</p>
+                            attribute value.</p>
 <p class="code">
-const char *ppdLocalizeMarkerName(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *name);</p>
+const char *ppdLocalizeMarkerName(ppd_file_t *ppd, const char *name);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1268,7 +1245,7 @@ name can be found, <code>NULL</code> is returned.
 <h3 class="function"><a id="ppdMarkDefaults">ppdMarkDefaults</a></h3>
 <p class="description">Mark all default options in the PPD file.</p>
 <p class="code">
-void ppdMarkDefaults(<a href="#ppd_file_t">ppd_file_t</a> *ppd);</p>
+void ppdMarkDefaults(ppd_file_t *ppd);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1276,9 +1253,9 @@ void ppdMarkDefaults(<a href="#ppd_file_t">ppd_file_t</a> *ppd);</p>
 </tbody></table>
 <h3 class="function"><a id="ppdMarkOption">ppdMarkOption</a></h3>
 <p class="description">Mark an option in a PPD file and return the number of
-conflicts.</p>
+                    conflicts.</p>
 <p class="code">
-int ppdMarkOption(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option, const char *choice);</p>
+int ppdMarkOption(ppd_file_t *ppd, const char *option, const char *choice);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1293,7 +1270,7 @@ int ppdMarkOption(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option,
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdNextCustomParam">ppdNextCustomParam</a></h3>
 <p class="description">Return the next parameter for a custom option.</p>
 <p class="code">
-<a href="#ppd_cparam_t">ppd_cparam_t</a> *ppdNextCustomParam(<a href="#ppd_coption_t">ppd_coption_t</a> *opt);</p>
+ppd_cparam_t *ppdNextCustomParam(ppd_coption_t *opt);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>opt</th>
@@ -1304,7 +1281,7 @@ int ppdMarkOption(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option,
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ppdNextOption">ppdNextOption</a></h3>
 <p class="description">Return the next option in the PPD file.</p>
 <p class="code">
-<a href="#ppd_option_t">ppd_option_t</a> *ppdNextOption(<a href="#ppd_file_t">ppd_file_t</a> *ppd);</p>
+<a href="#ppd_option_t">ppd_option_t</a> *ppdNextOption(ppd_file_t *ppd);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1319,7 +1296,7 @@ int ppdMarkOption(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *option,
 <h3 class="function"><a id="ppdPageLength">ppdPageLength</a></h3>
 <p class="description">Get the page length for the given size.</p>
 <p class="code">
-float ppdPageLength(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *name);</p>
+float ppdPageLength(ppd_file_t *ppd, const char *name);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1332,7 +1309,7 @@ float ppdPageLength(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *name)
 <h3 class="function"><a id="ppdPageSize">ppdPageSize</a></h3>
 <p class="description">Get the page size record for the named size.</p>
 <p class="code">
-<a href="#ppd_size_t">ppd_size_t</a> *ppdPageSize(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *name);</p>
+ppd_size_t *ppdPageSize(ppd_file_t *ppd, const char *name);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1345,7 +1322,7 @@ float ppdPageLength(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *name)
 <h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="ppdPageSizeLimits">ppdPageSizeLimits</a></h3>
 <p class="description">Return the custom page size limits.</p>
 <p class="code">
-int ppdPageSizeLimits(<a href="#ppd_file_t">ppd_file_t</a> *ppd, <a href="#ppd_size_t">ppd_size_t</a> *minimum, <a href="#ppd_size_t">ppd_size_t</a> *maximum);</p>
+int ppdPageSizeLimits(ppd_file_t *ppd, ppd_size_t *minimum, ppd_size_t *maximum);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1368,7 +1345,7 @@ If the specified PPD file does not support custom page sizes, both
 <h3 class="function"><a id="ppdPageWidth">ppdPageWidth</a></h3>
 <p class="description">Get the page width for the given size.</p>
 <p class="code">
-float ppdPageWidth(<a href="#ppd_file_t">ppd_file_t</a> *ppd, const char *name);</p>
+float ppdPageWidth(ppd_file_t *ppd, const char *name);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ppd</th>
@@ -1399,76 +1376,21 @@ typedef struct <a href="#ppd_choice_s">ppd_choice_s</a> ppd_choice_t;
 <p class="code">
 typedef enum <a href="#ppd_conform_e">ppd_conform_e</a> ppd_conform_t;
 </p>
-<h3 class="typedef"><a id="ppd_const_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_const_t</a></h3>
-<p class="description">Constraints </p>
-<p class="code">
-typedef struct <a href="#ppd_const_s">ppd_const_s</a> ppd_const_t;
-</p>
-<h3 class="typedef"><a id="ppd_coption_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_coption_t</a></h3>
-<p class="description">Custom Option </p>
-<p class="code">
-typedef struct <a href="#ppd_coption_s">ppd_coption_s</a> ppd_coption_t;
-</p>
-<h3 class="typedef"><a id="ppd_cparam_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_cparam_t</a></h3>
-<p class="description">Custom Parameter </p>
-<p class="code">
-typedef struct <a href="#ppd_cparam_s">ppd_cparam_s</a> ppd_cparam_t;
-</p>
-<h3 class="typedef"><a id="ppd_cplimit_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_cplimit_t</a></h3>
-<p class="description">Custom Parameter Limit </p>
-<p class="code">
-typedef union <a href="#ppd_cplimit_u">ppd_cplimit_u</a> ppd_cplimit_t;
-</p>
-<h3 class="typedef"><a id="ppd_cptype_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_cptype_t</a></h3>
-<p class="description">Custom Parameter Type </p>
-<p class="code">
-typedef enum <a href="#ppd_cptype_e">ppd_cptype_e</a> ppd_cptype_t;
-</p>
-<h3 class="typedef"><a id="ppd_cpvalue_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_cpvalue_t</a></h3>
-<p class="description">Custom Parameter Value </p>
-<p class="code">
-typedef union <a href="#ppd_cpvalue_u">ppd_cpvalue_u</a> ppd_cpvalue_t;
-</p>
 <h3 class="typedef"><a id="ppd_cs_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_cs_t</a></h3>
 <p class="description">Colorspaces </p>
 <p class="code">
 typedef enum <a href="#ppd_cs_e">ppd_cs_e</a> ppd_cs_t;
 </p>
-<h3 class="typedef"><a id="ppd_emul_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_emul_t</a></h3>
-<p class="description">Emulators </p>
-<p class="code">
-typedef struct <a href="#ppd_emul_s">ppd_emul_s</a> ppd_emul_t;
-</p>
-<h3 class="typedef"><a id="ppd_file_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_file_t</a></h3>
-<p class="description">PPD File </p>
-<p class="code">
-typedef struct <a href="#ppd_file_s">ppd_file_s</a> ppd_file_t;
-</p>
-<h3 class="typedef"><a id="ppd_group_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_group_t</a></h3>
-<p class="description">Groups </p>
-<p class="code">
-typedef struct <a href="#ppd_group_s">ppd_group_s</a> ppd_group_t;
-</p>
 <h3 class="typedef"><a id="ppd_option_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_option_t</a></h3>
 <p class="description">Options </p>
 <p class="code">
 typedef struct <a href="#ppd_option_s">ppd_option_s</a> ppd_option_t;
 </p>
-<h3 class="typedef"><a id="ppd_profile_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_profile_t</a></h3>
-<p class="description">sRGB Color Profiles </p>
-<p class="code">
-typedef struct <a href="#ppd_profile_s">ppd_profile_s</a> ppd_profile_t;
-</p>
 <h3 class="typedef"><a id="ppd_section_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_section_t</a></h3>
 <p class="description">Order dependency sections </p>
 <p class="code">
 typedef enum <a href="#ppd_section_e">ppd_section_e</a> ppd_section_t;
 </p>
-<h3 class="typedef"><a id="ppd_size_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_size_t</a></h3>
-<p class="description">Page Sizes </p>
-<p class="code">
-typedef struct <a href="#ppd_size_s">ppd_size_s</a> ppd_size_t;
-</p>
 <h3 class="typedef"><a id="ppd_status_t"><span class="info">&#160;DEPRECATED&#160;</span>ppd_status_t</a></h3>
 <p class="description">Status Codes </p>
 <p class="code">
@@ -1521,236 +1443,12 @@ typedef enum <a href="#ppd_ui_e">ppd_ui_e</a> ppd_ui_t;
 <tr><th>text[PPD_MAX_TEXT] </th>
 <td class="description">Human-readable option name</td></tr>
 </tbody></table>
-<h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_const_s">ppd_const_s</a></h3>
-<p class="description">Constraints </p>
-<p class="code">struct ppd_const_s {<br>
-&#160;&#160;&#160;&#160;char choice1[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;char choice2[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;char option1[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;char option2[PPD_MAX_NAME];<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>choice1[PPD_MAX_NAME] </th>
-<td class="description">First option/choice (blank for all)</td></tr>
-<tr><th>choice2[PPD_MAX_NAME] </th>
-<td class="description">Second option/choice (blank for all)</td></tr>
-<tr><th>option1[PPD_MAX_NAME] </th>
-<td class="description">First keyword</td></tr>
-<tr><th>option2[PPD_MAX_NAME] </th>
-<td class="description">Second keyword</td></tr>
-</tbody></table>
-<h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_coption_s">ppd_coption_s</a></h3>
-<p class="description">Custom Option </p>
-<p class="code">struct ppd_coption_s {<br>
-&#160;&#160;&#160;&#160;char keyword[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;int marked;<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_option_t">ppd_option_t</a> *option;<br>
-&#160;&#160;&#160;&#160;cups_array_t *params;<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>keyword[PPD_MAX_NAME] </th>
-<td class="description">Name of option that is being extended...</td></tr>
-<tr><th>marked </th>
-<td class="description">Extended option is marked</td></tr>
-<tr><th>option </th>
-<td class="description">Option that is being extended...</td></tr>
-<tr><th>params </th>
-<td class="description">Parameters</td></tr>
-</tbody></table>
-<h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_cparam_s">ppd_cparam_s</a></h3>
-<p class="description">Custom Parameter </p>
-<p class="code">struct ppd_cparam_s {<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_cpvalue_t">ppd_cpvalue_t</a> current;<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_cplimit_t">ppd_cplimit_t</a> minimum, maximum;<br>
-&#160;&#160;&#160;&#160;char name[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;int order;<br>
-&#160;&#160;&#160;&#160;char text[PPD_MAX_TEXT];<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_cptype_t">ppd_cptype_t</a> type;<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>current </th>
-<td class="description">Current value</td></tr>
-<tr><th>maximum </th>
-<td class="description">Maximum value</td></tr>
-<tr><th>name[PPD_MAX_NAME] </th>
-<td class="description">Parameter name</td></tr>
-<tr><th>order </th>
-<td class="description">Order (0 to N)</td></tr>
-<tr><th>text[PPD_MAX_TEXT] </th>
-<td class="description">Human-readable text</td></tr>
-<tr><th>type </th>
-<td class="description">Parameter type</td></tr>
-</tbody></table>
-<h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_emul_s">ppd_emul_s</a></h3>
-<p class="description">Emulators </p>
-<p class="code">struct ppd_emul_s {<br>
-&#160;&#160;&#160;&#160;char name[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;char *start;<br>
-&#160;&#160;&#160;&#160;char *stop;<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>name[PPD_MAX_NAME] </th>
-<td class="description">Emulator name</td></tr>
-<tr><th>start </th>
-<td class="description">Code to switch to this emulation</td></tr>
-<tr><th>stop </th>
-<td class="description">Code to stop this emulation</td></tr>
-</tbody></table>
-<h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_file_s">ppd_file_s</a></h3>
-<p class="description">PPD File </p>
-<p class="code">struct ppd_file_s {<br>
-&#160;&#160;&#160;&#160;int accurate_screens;<br>
-&#160;&#160;&#160;&#160;int color_device;<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_cs_t">ppd_cs_t</a> colorspace;<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_const_t">ppd_const_t</a> *consts;<br>
-&#160;&#160;&#160;&#160;int contone_only;<br>
-&#160;&#160;&#160;&#160;float custom_margins[4];<br>
-&#160;&#160;&#160;&#160;float custom_max[2];<br>
-&#160;&#160;&#160;&#160;float custom_min[2];<br>
-&#160;&#160;&#160;&#160;char **filters;<br>
-&#160;&#160;&#160;&#160;int flip_duplex;<br>
-&#160;&#160;&#160;&#160;char **fonts;<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_group_t">ppd_group_t</a> *groups;<br>
-&#160;&#160;&#160;&#160;char *jcl_begin;<br>
-&#160;&#160;&#160;&#160;char *jcl_end;<br>
-&#160;&#160;&#160;&#160;char *jcl_ps;<br>
-&#160;&#160;&#160;&#160;int landscape;<br>
-&#160;&#160;&#160;&#160;char *lang_encoding;<br>
-&#160;&#160;&#160;&#160;char *lang_version;<br>
-&#160;&#160;&#160;&#160;int language_level;<br>
-&#160;&#160;&#160;&#160;int manual_copies;<br>
-&#160;&#160;&#160;&#160;char *manufacturer;<br>
-&#160;&#160;&#160;&#160;int model_number;<br>
-&#160;&#160;&#160;&#160;char *modelname;<br>
-&#160;&#160;&#160;&#160;char *nickname;<br>
-&#160;&#160;&#160;&#160;int num_consts;<br>
-&#160;&#160;&#160;&#160;int num_filters;<br>
-&#160;&#160;&#160;&#160;int num_fonts;<br>
-&#160;&#160;&#160;&#160;int num_groups;<br>
-&#160;&#160;&#160;&#160;int num_profiles;<br>
-&#160;&#160;&#160;&#160;int num_sizes;<br>
-&#160;&#160;&#160;&#160;char *patches;<br>
-&#160;&#160;&#160;&#160;char *pcfilename;<br>
-&#160;&#160;&#160;&#160;char *product;<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_profile_t">ppd_profile_t</a> *profiles;<br>
-&#160;&#160;&#160;&#160;char *protocols;<br>
-&#160;&#160;&#160;&#160;char *shortnickname;<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_size_t">ppd_size_t</a> *sizes;<br>
-&#160;&#160;&#160;&#160;int throughput;<br>
-&#160;&#160;&#160;&#160;char *ttrasterizer;<br>
-&#160;&#160;&#160;&#160;int variable_sizes;<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>accurate_screens </th>
-<td class="description">1 = supports accurate screens, 0 = not</td></tr>
-<tr><th>color_device </th>
-<td class="description">1 = color device, 0 = grayscale</td></tr>
-<tr><th>colorspace </th>
-<td class="description">Default colorspace</td></tr>
-<tr><th>consts </th>
-<td class="description">UI/Non-UI constraints</td></tr>
-<tr><th>contone_only </th>
-<td class="description">1 = continuous tone only, 0 = not</td></tr>
-<tr><th>custom_margins[4] </th>
-<td class="description">Margins around page</td></tr>
-<tr><th>custom_max[2] </th>
-<td class="description">Maximum variable page size</td></tr>
-<tr><th>custom_min[2] </th>
-<td class="description">Minimum variable page size</td></tr>
-<tr><th>filters </th>
-<td class="description">Filter strings...</td></tr>
-<tr><th>flip_duplex <span class="info">&#160;DEPRECATED&#160;</span></th>
-<td class="description">1 = Flip page for back sides </td></tr>
-<tr><th>fonts </th>
-<td class="description">Pre-loaded fonts</td></tr>
-<tr><th>groups </th>
-<td class="description">UI groups</td></tr>
-<tr><th>jcl_begin </th>
-<td class="description">Start JCL commands</td></tr>
-<tr><th>jcl_end </th>
-<td class="description">End JCL commands</td></tr>
-<tr><th>jcl_ps </th>
-<td class="description">Enter PostScript interpreter</td></tr>
-<tr><th>landscape </th>
-<td class="description">-90 or 90</td></tr>
-<tr><th>lang_encoding </th>
-<td class="description">Language encoding</td></tr>
-<tr><th>lang_version </th>
-<td class="description">Language version (English, Spanish, etc.)</td></tr>
-<tr><th>language_level </th>
-<td class="description">Language level of device</td></tr>
-<tr><th>manual_copies </th>
-<td class="description">1 = Copies done manually, 0 = hardware</td></tr>
-<tr><th>manufacturer </th>
-<td class="description">Manufacturer name</td></tr>
-<tr><th>model_number </th>
-<td class="description">Device-specific model number</td></tr>
-<tr><th>modelname </th>
-<td class="description">Model name (general)</td></tr>
-<tr><th>nickname </th>
-<td class="description">Nickname (specific)</td></tr>
-<tr><th>num_consts </th>
-<td class="description">Number of UI/Non-UI constraints</td></tr>
-<tr><th>num_filters </th>
-<td class="description">Number of filters</td></tr>
-<tr><th>num_fonts </th>
-<td class="description">Number of pre-loaded fonts</td></tr>
-<tr><th>num_groups </th>
-<td class="description">Number of UI groups</td></tr>
-<tr><th>num_profiles <span class="info">&#160;DEPRECATED&#160;</span></th>
-<td class="description">Number of sRGB color profiles </td></tr>
-<tr><th>num_sizes </th>
-<td class="description">Number of page sizes</td></tr>
-<tr><th>patches </th>
-<td class="description">Patch commands to be sent to printer</td></tr>
-<tr><th>pcfilename <span class="info">&#160;CUPS 1.1.19/macOS 10.3&#160;</span></th>
-<td class="description">PCFileName string </td></tr>
-<tr><th>product </th>
-<td class="description">Product name (from PS RIP/interpreter)</td></tr>
-<tr><th>profiles <span class="info">&#160;DEPRECATED&#160;</span></th>
-<td class="description">sRGB color profiles </td></tr>
-<tr><th>protocols <span class="info">&#160;CUPS 1.1.19/macOS 10.3&#160;</span></th>
-<td class="description">Protocols (BCP, TBCP) string </td></tr>
-<tr><th>shortnickname </th>
-<td class="description">Short version of nickname</td></tr>
-<tr><th>sizes </th>
-<td class="description">Page sizes</td></tr>
-<tr><th>throughput </th>
-<td class="description">Pages per minute</td></tr>
-<tr><th>ttrasterizer </th>
-<td class="description">Truetype rasterizer</td></tr>
-<tr><th>variable_sizes </th>
-<td class="description">1 = supports variable sizes, 0 = doesn't</td></tr>
-</tbody></table>
 <h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_group_s">ppd_group_s</a></h3>
 <p class="description">Groups </p>
 <p class="code">struct ppd_group_s {<br>
-&#160;&#160;&#160;&#160;char text[PPD_MAX_TEXT - PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;char name[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;int num_options;<br>
-&#160;&#160;&#160;&#160;int num_subgroups;<br>
-&#160;&#160;&#160;&#160;<a href="#ppd_option_t">ppd_option_t</a> *options;<br>
-&#160;&#160;&#160;&#160;struct <a href="#ppd_group_s">ppd_group_s</a> *subgroups;<br>
 };</p>
 <h4 class="members">Members</h4>
 <table class="list"><tbody>
-<tr><th>PPD_MAX_NAME] </th>
-<td class="description">Human-readable group name</td></tr>
-<tr><th>name[PPD_MAX_NAME] <span class="info">&#160;CUPS 1.1.18/macOS 10.3&#160;</span></th>
-<td class="description">Group name </td></tr>
-<tr><th>num_options </th>
-<td class="description">Number of options</td></tr>
-<tr><th>num_subgroups </th>
-<td class="description">Number of sub-groups</td></tr>
-<tr><th>options </th>
-<td class="description">Options</td></tr>
-<tr><th>subgroups </th>
-<td class="description">Sub-groups (max depth = 1)</td></tr>
 </tbody></table>
 <h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_option_s">ppd_option_s</a></h3>
 <p class="description">Options </p>
@@ -1786,122 +1484,6 @@ typedef enum <a href="#ppd_ui_e">ppd_ui_e</a> ppd_ui_t;
 <tr><th>ui </th>
 <td class="description">Type of UI option</td></tr>
 </tbody></table>
-<h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_profile_s">ppd_profile_s</a></h3>
-<p class="description">sRGB Color Profiles </p>
-<p class="code">struct ppd_profile_s {<br>
-&#160;&#160;&#160;&#160;float density;<br>
-&#160;&#160;&#160;&#160;float gamma;<br>
-&#160;&#160;&#160;&#160;float matrix[3][3];<br>
-&#160;&#160;&#160;&#160;char media_type[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;char resolution[PPD_MAX_NAME];<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>density </th>
-<td class="description">Ink density to use</td></tr>
-<tr><th>gamma </th>
-<td class="description">Gamma correction to use</td></tr>
-<tr><th>matrix[3][3] </th>
-<td class="description">Transform matrix</td></tr>
-<tr><th>media_type[PPD_MAX_NAME] </th>
-<td class="description">Media type or &quot;-&quot;</td></tr>
-<tr><th>resolution[PPD_MAX_NAME] </th>
-<td class="description">Resolution or &quot;-&quot;</td></tr>
-</tbody></table>
-<h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_size_s">ppd_size_s</a></h3>
-<p class="description">Page Sizes </p>
-<p class="code">struct ppd_size_s {<br>
-&#160;&#160;&#160;&#160;float bottom;<br>
-&#160;&#160;&#160;&#160;float left;<br>
-&#160;&#160;&#160;&#160;float length;<br>
-&#160;&#160;&#160;&#160;int marked;<br>
-&#160;&#160;&#160;&#160;char name[PPD_MAX_NAME];<br>
-&#160;&#160;&#160;&#160;float right;<br>
-&#160;&#160;&#160;&#160;float top;<br>
-&#160;&#160;&#160;&#160;float width;<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>bottom </th>
-<td class="description">Bottom printable margin in points</td></tr>
-<tr><th>left </th>
-<td class="description">Left printable margin in points</td></tr>
-<tr><th>length </th>
-<td class="description">Length of media in points</td></tr>
-<tr><th>marked </th>
-<td class="description">Page size selected?</td></tr>
-<tr><th>name[PPD_MAX_NAME] </th>
-<td class="description">Media size option</td></tr>
-<tr><th>right </th>
-<td class="description">Right printable margin in points</td></tr>
-<tr><th>top </th>
-<td class="description">Top printable margin in points</td></tr>
-<tr><th>width </th>
-<td class="description">Width of media in points</td></tr>
-</tbody></table>
-<h2 class="title"><a id="UNIONS">Unions</a></h2>
-<h3 class="union"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_cplimit_u">ppd_cplimit_u</a></h3>
-<p class="description">Custom Parameter Limit </p>
-<p class="code">union ppd_cplimit_u {<br>
-&#160;&#160;&#160;&#160;float custom_curve;<br>
-&#160;&#160;&#160;&#160;int custom_int;<br>
-&#160;&#160;&#160;&#160;float custom_invcurve;<br>
-&#160;&#160;&#160;&#160;int custom_passcode;<br>
-&#160;&#160;&#160;&#160;int custom_password;<br>
-&#160;&#160;&#160;&#160;float custom_points;<br>
-&#160;&#160;&#160;&#160;float custom_real;<br>
-&#160;&#160;&#160;&#160;int custom_string;<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>custom_curve </th>
-<td class="description">Gamma value</td></tr>
-<tr><th>custom_int </th>
-<td class="description">Integer value</td></tr>
-<tr><th>custom_invcurve </th>
-<td class="description">Gamma value</td></tr>
-<tr><th>custom_passcode </th>
-<td class="description">Passcode length</td></tr>
-<tr><th>custom_password </th>
-<td class="description">Password length</td></tr>
-<tr><th>custom_points </th>
-<td class="description">Measurement value</td></tr>
-<tr><th>custom_real </th>
-<td class="description">Real value</td></tr>
-<tr><th>custom_string </th>
-<td class="description">String length</td></tr>
-</tbody></table>
-<h3 class="union"><span class="info">&#160;DEPRECATED&#160;</span><a id="ppd_cpvalue_u">ppd_cpvalue_u</a></h3>
-<p class="description">Custom Parameter Value </p>
-<p class="code">union ppd_cpvalue_u {<br>
-&#160;&#160;&#160;&#160;float custom_curve;<br>
-&#160;&#160;&#160;&#160;int custom_int;<br>
-&#160;&#160;&#160;&#160;float custom_invcurve;<br>
-&#160;&#160;&#160;&#160;char *custom_passcode;<br>
-&#160;&#160;&#160;&#160;char *custom_password;<br>
-&#160;&#160;&#160;&#160;float custom_points;<br>
-&#160;&#160;&#160;&#160;float custom_real;<br>
-&#160;&#160;&#160;&#160;char *custom_string;<br>
-};</p>
-<h4 class="members">Members</h4>
-<table class="list"><tbody>
-<tr><th>custom_curve </th>
-<td class="description">Gamma value</td></tr>
-<tr><th>custom_int </th>
-<td class="description">Integer value</td></tr>
-<tr><th>custom_invcurve </th>
-<td class="description">Gamma value</td></tr>
-<tr><th>custom_passcode </th>
-<td class="description">Passcode value</td></tr>
-<tr><th>custom_password </th>
-<td class="description">Password value</td></tr>
-<tr><th>custom_points </th>
-<td class="description">Measurement value</td></tr>
-<tr><th>custom_real </th>
-<td class="description">Real value</td></tr>
-<tr><th>custom_string </th>
-<td class="description">String value</td></tr>
-</tbody></table>
 <h2 class="title"><a id="ENUMERATIONS">Constants</a></h2>
 <h3 class="enumeration"><a id="ppd_conform_e"><span class="info">&#160;DEPRECATED&#160;</span>ppd_conform_e</a></h3>
 <p class="description">Conformance Levels </p>
@@ -1910,20 +1492,6 @@ typedef enum <a href="#ppd_ui_e">ppd_ui_e</a> ppd_ui_t;
 <tr><th>PPD_CONFORM_RELAXED </th><td class="description">Relax whitespace and control char</td></tr>
 <tr><th>PPD_CONFORM_STRICT </th><td class="description">Require strict conformance</td></tr>
 </tbody></table>
-<h3 class="enumeration"><a id="ppd_cptype_e"><span class="info">&#160;DEPRECATED&#160;</span>ppd_cptype_e</a></h3>
-<p class="description">Custom Parameter Type </p>
-<h4 class="constants">Constants</h4>
-<table class="list"><tbody>
-<tr><th>PPD_CUSTOM_CURVE </th><td class="description">Curve value for f(x) = x^value</td></tr>
-<tr><th>PPD_CUSTOM_INT </th><td class="description">Integer number value</td></tr>
-<tr><th>PPD_CUSTOM_INVCURVE </th><td class="description">Curve value for f(x) = x^(1/value)</td></tr>
-<tr><th>PPD_CUSTOM_PASSCODE </th><td class="description">String of (hidden) numbers</td></tr>
-<tr><th>PPD_CUSTOM_PASSWORD </th><td class="description">String of (hidden) characters</td></tr>
-<tr><th>PPD_CUSTOM_POINTS </th><td class="description">Measurement value in points</td></tr>
-<tr><th>PPD_CUSTOM_REAL </th><td class="description">Real number value</td></tr>
-<tr><th>PPD_CUSTOM_STRING </th><td class="description">String of characters</td></tr>
-<tr><th>PPD_CUSTOM_UNKNOWN </th><td class="description">Unknown type (error)</td></tr>
-</tbody></table>
 <h3 class="enumeration"><a id="ppd_cs_e"><span class="info">&#160;DEPRECATED&#160;</span>ppd_cs_e</a></h3>
 <p class="description">Colorspaces </p>
 <h4 class="constants">Constants</h4>
index 7554575775fd9d5677c62727b199d7ccba00acaf..752b4e75bc2047381729df36652b7c10e99bec4d 100644 (file)
Binary files a/doc/help/cupspm.epub and b/doc/help/cupspm.epub differ
index 57bcbf2dd38525eaf3504b2ee7d045041911339f..ba85a94a8112754535260047c1dadfcd5c6a28ae 100644 (file)
@@ -9,7 +9,7 @@
 <meta name="author" content="Michael R Sweet">
 <meta name="language" content="en-US">
 <meta name="copyright" content="Copyright © 2021-2023 by OpenPrinting. All Rights Reserved.">
-<meta name="version" content="2.4.0">
+<meta name="version" content="2.5.0">
 <style type="text/css"><!--
 body {
   background: white;
@@ -272,52 +272,94 @@ span.string {
 <li><a href="#authentication">Authentication</a></li>
 </ul></li>
 <li><a href="#FUNCTIONS">Functions</a><ul class="subcontents">
+<li><a href="#DllMain">DllMain</a></li>
 <li><a href="#cupsAddDest">cupsAddDest</a></li>
 <li><a href="#cupsAddDestMediaOptions">cupsAddDestMediaOptions</a></li>
+<li><a href="#cupsAddDestMediaOptions2">cupsAddDestMediaOptions2</a></li>
 <li><a href="#cupsAddIntegerOption">cupsAddIntegerOption</a></li>
 <li><a href="#cupsAddOption">cupsAddOption</a></li>
+<li><a href="#cupsAreCredentialsValidForName">cupsAreCredentialsValidForName</a></li>
 <li><a href="#cupsArrayAdd">cupsArrayAdd</a></li>
+<li><a href="#cupsArrayAddStrings">cupsArrayAddStrings</a></li>
 <li><a href="#cupsArrayClear">cupsArrayClear</a></li>
-<li><a href="#cupsArrayCount">cupsArrayCount</a></li>
-<li><a href="#cupsArrayCurrent">cupsArrayCurrent</a></li>
 <li><a href="#cupsArrayDelete">cupsArrayDelete</a></li>
 <li><a href="#cupsArrayDup">cupsArrayDup</a></li>
 <li><a href="#cupsArrayFind">cupsArrayFind</a></li>
-<li><a href="#cupsArrayFirst">cupsArrayFirst</a></li>
+<li><a href="#cupsArrayGetCount">cupsArrayGetCount</a></li>
+<li><a href="#cupsArrayGetCurrent">cupsArrayGetCurrent</a></li>
+<li><a href="#cupsArrayGetElement">cupsArrayGetElement</a></li>
+<li><a href="#cupsArrayGetFirst">cupsArrayGetFirst</a></li>
 <li><a href="#cupsArrayGetIndex">cupsArrayGetIndex</a></li>
 <li><a href="#cupsArrayGetInsert">cupsArrayGetInsert</a></li>
-<li><a href="#cupsArrayIndex">cupsArrayIndex</a></li>
+<li><a href="#cupsArrayGetLast">cupsArrayGetLast</a></li>
+<li><a href="#cupsArrayGetNext">cupsArrayGetNext</a></li>
+<li><a href="#cupsArrayGetPrev">cupsArrayGetPrev</a></li>
+<li><a href="#cupsArrayGetUserData">cupsArrayGetUserData</a></li>
 <li><a href="#cupsArrayInsert">cupsArrayInsert</a></li>
-<li><a href="#cupsArrayLast">cupsArrayLast</a></li>
-<li><a href="#cupsArrayNew">cupsArrayNew</a></li>
-<li><a href="#cupsArrayNew2">cupsArrayNew2</a></li>
 <li><a href="#cupsArrayNew3">cupsArrayNew3</a></li>
-<li><a href="#cupsArrayNext">cupsArrayNext</a></li>
-<li><a href="#cupsArrayPrev">cupsArrayPrev</a></li>
+<li><a href="#cupsArrayNewStrings">cupsArrayNewStrings</a></li>
 <li><a href="#cupsArrayRemove">cupsArrayRemove</a></li>
 <li><a href="#cupsArrayRestore">cupsArrayRestore</a></li>
 <li><a href="#cupsArraySave">cupsArraySave</a></li>
-<li><a href="#cupsArrayUserData">cupsArrayUserData</a></li>
 <li><a href="#cupsCancelDestJob">cupsCancelDestJob</a></li>
+<li><a href="#cupsCharsetToUTF8">cupsCharsetToUTF8</a></li>
 <li><a href="#cupsCheckDestSupported">cupsCheckDestSupported</a></li>
 <li><a href="#cupsCloseDestJob">cupsCloseDestJob</a></li>
+<li><a href="#cupsConcatString">cupsConcatString</a></li>
+<li><a href="#cupsCondBroadcast">cupsCondBroadcast</a></li>
+<li><a href="#cupsCondDestroy">cupsCondDestroy</a></li>
+<li><a href="#cupsCondInit">cupsCondInit</a></li>
+<li><a href="#cupsCondWait">cupsCondWait</a></li>
 <li><a href="#cupsConnectDest">cupsConnectDest</a></li>
+<li><a href="#cupsCopyCredentials">cupsCopyCredentials</a></li>
+<li><a href="#cupsCopyCredentialsKey">cupsCopyCredentialsKey</a></li>
+<li><a href="#cupsCopyCredentialsRequest">cupsCopyCredentialsRequest</a></li>
 <li><a href="#cupsCopyDest">cupsCopyDest</a></li>
 <li><a href="#cupsCopyDestConflicts">cupsCopyDestConflicts</a></li>
 <li><a href="#cupsCopyDestInfo">cupsCopyDestInfo</a></li>
+<li><a href="#cupsCopyString">cupsCopyString</a></li>
+<li><a href="#cupsCreateCredentials">cupsCreateCredentials</a></li>
+<li><a href="#cupsCreateCredentialsRequest">cupsCreateCredentialsRequest</a></li>
 <li><a href="#cupsCreateDestJob">cupsCreateDestJob</a></li>
+<li><a href="#cupsCreateTempFd">cupsCreateTempFd</a></li>
+<li><a href="#cupsCreateTempFile">cupsCreateTempFile</a></li>
+<li><a href="#cupsDNSSDAssembleFullName">cupsDNSSDAssembleFullName</a></li>
+<li><a href="#cupsDNSSDBrowseDelete">cupsDNSSDBrowseDelete</a></li>
+<li><a href="#cupsDNSSDBrowseGetContext">cupsDNSSDBrowseGetContext</a></li>
+<li><a href="#cupsDNSSDBrowseNew">cupsDNSSDBrowseNew</a></li>
+<li><a href="#cupsDNSSDCopyHostName">cupsDNSSDCopyHostName</a></li>
+<li><a href="#cupsDNSSDDecodeTXT">cupsDNSSDDecodeTXT</a></li>
+<li><a href="#cupsDNSSDDelete">cupsDNSSDDelete</a></li>
+<li><a href="#cupsDNSSDGetConfigChanges">cupsDNSSDGetConfigChanges</a></li>
+<li><a href="#cupsDNSSDNew">cupsDNSSDNew</a></li>
+<li><a href="#cupsDNSSDQueryDelete">cupsDNSSDQueryDelete</a></li>
+<li><a href="#cupsDNSSDQueryGetContext">cupsDNSSDQueryGetContext</a></li>
+<li><a href="#cupsDNSSDQueryNew">cupsDNSSDQueryNew</a></li>
+<li><a href="#cupsDNSSDResolveDelete">cupsDNSSDResolveDelete</a></li>
+<li><a href="#cupsDNSSDResolveGetContext">cupsDNSSDResolveGetContext</a></li>
+<li><a href="#cupsDNSSDResolveNew">cupsDNSSDResolveNew</a></li>
+<li><a href="#cupsDNSSDSeparateFullName">cupsDNSSDSeparateFullName</a></li>
+<li><a href="#cupsDNSSDServiceAdd">cupsDNSSDServiceAdd</a></li>
+<li><a href="#cupsDNSSDServiceDelete">cupsDNSSDServiceDelete</a></li>
+<li><a href="#cupsDNSSDServiceGetContext">cupsDNSSDServiceGetContext</a></li>
+<li><a href="#cupsDNSSDServiceGetName">cupsDNSSDServiceGetName</a></li>
+<li><a href="#cupsDNSSDServiceNew">cupsDNSSDServiceNew</a></li>
+<li><a href="#cupsDNSSDServicePublish">cupsDNSSDServicePublish</a></li>
+<li><a href="#cupsDNSSDServiceSetLocation">cupsDNSSDServiceSetLocation</a></li>
 <li><a href="#cupsDirClose">cupsDirClose</a></li>
 <li><a href="#cupsDirOpen">cupsDirOpen</a></li>
 <li><a href="#cupsDirRead">cupsDirRead</a></li>
 <li><a href="#cupsDirRewind">cupsDirRewind</a></li>
 <li><a href="#cupsDoAuthentication">cupsDoAuthentication</a></li>
+<li><a href="#cupsDoFileRequest">cupsDoFileRequest</a></li>
+<li><a href="#cupsDoIORequest">cupsDoIORequest</a></li>
+<li><a href="#cupsDoRequest">cupsDoRequest</a></li>
 <li><a href="#cupsEncodeOption">cupsEncodeOption</a></li>
 <li><a href="#cupsEncodeOptions">cupsEncodeOptions</a></li>
 <li><a href="#cupsEncodeOptions2">cupsEncodeOptions2</a></li>
 <li><a href="#cupsEncryption">cupsEncryption</a></li>
 <li><a href="#cupsEnumDests">cupsEnumDests</a></li>
 <li><a href="#cupsFileClose">cupsFileClose</a></li>
-<li><a href="#cupsFileCompression">cupsFileCompression</a></li>
 <li><a href="#cupsFileEOF">cupsFileEOF</a></li>
 <li><a href="#cupsFileFind">cupsFileFind</a></li>
 <li><a href="#cupsFileFlush">cupsFileFlush</a></li>
@@ -325,6 +367,7 @@ span.string {
 <li><a href="#cupsFileGetConf">cupsFileGetConf</a></li>
 <li><a href="#cupsFileGetLine">cupsFileGetLine</a></li>
 <li><a href="#cupsFileGets">cupsFileGets</a></li>
+<li><a href="#cupsFileIsCompressed">cupsFileIsCompressed</a></li>
 <li><a href="#cupsFileLock">cupsFileLock</a></li>
 <li><a href="#cupsFileNumber">cupsFileNumber</a></li>
 <li><a href="#cupsFileOpen">cupsFileOpen</a></li>
@@ -347,31 +390,116 @@ span.string {
 <li><a href="#cupsFindDestReady">cupsFindDestReady</a></li>
 <li><a href="#cupsFindDestSupported">cupsFindDestSupported</a></li>
 <li><a href="#cupsFinishDestDocument">cupsFinishDestDocument</a></li>
+<li><a href="#cupsFormDecode">cupsFormDecode</a></li>
+<li><a href="#cupsFormEncode">cupsFormEncode</a></li>
 <li><a href="#cupsFreeDestInfo">cupsFreeDestInfo</a></li>
 <li><a href="#cupsFreeDests">cupsFreeDests</a></li>
 <li><a href="#cupsFreeJobs">cupsFreeJobs</a></li>
 <li><a href="#cupsFreeOptions">cupsFreeOptions</a></li>
+<li><a href="#cupsGetCredentialsExpiration">cupsGetCredentialsExpiration</a></li>
+<li><a href="#cupsGetCredentialsInfo">cupsGetCredentialsInfo</a></li>
+<li><a href="#cupsGetCredentialsTrust">cupsGetCredentialsTrust</a></li>
 <li><a href="#cupsGetDest">cupsGetDest</a></li>
 <li><a href="#cupsGetDestMediaByIndex">cupsGetDestMediaByIndex</a></li>
+<li><a href="#cupsGetDestMediaByIndex2">cupsGetDestMediaByIndex2</a></li>
 <li><a href="#cupsGetDestMediaByName">cupsGetDestMediaByName</a></li>
+<li><a href="#cupsGetDestMediaByName2">cupsGetDestMediaByName2</a></li>
 <li><a href="#cupsGetDestMediaBySize">cupsGetDestMediaBySize</a></li>
+<li><a href="#cupsGetDestMediaBySize2">cupsGetDestMediaBySize2</a></li>
 <li><a href="#cupsGetDestMediaCount">cupsGetDestMediaCount</a></li>
 <li><a href="#cupsGetDestMediaDefault">cupsGetDestMediaDefault</a></li>
+<li><a href="#cupsGetDestMediaDefault2">cupsGetDestMediaDefault2</a></li>
 <li><a href="#cupsGetDestWithURI">cupsGetDestWithURI</a></li>
 <li><a href="#cupsGetDests2">cupsGetDests2</a></li>
+<li><a href="#cupsGetEncryption">cupsGetEncryption</a></li>
+<li><a href="#cupsGetError">cupsGetError</a></li>
+<li><a href="#cupsGetErrorString">cupsGetErrorString</a></li>
+<li><a href="#cupsGetFd">cupsGetFd</a></li>
+<li><a href="#cupsGetFile">cupsGetFile</a></li>
 <li><a href="#cupsGetIntegerOption">cupsGetIntegerOption</a></li>
 <li><a href="#cupsGetJobs2">cupsGetJobs2</a></li>
 <li><a href="#cupsGetNamedDest">cupsGetNamedDest</a></li>
 <li><a href="#cupsGetOption">cupsGetOption</a></li>
 <li><a href="#cupsGetPassword2">cupsGetPassword2</a></li>
+<li><a href="#cupsGetRand">cupsGetRand</a></li>
+<li><a href="#cupsGetResponse">cupsGetResponse</a></li>
+<li><a href="#cupsGetServer">cupsGetServer</a></li>
+<li><a href="#cupsGetUser">cupsGetUser</a></li>
+<li><a href="#cupsGetUserAgent">cupsGetUserAgent</a></li>
+<li><a href="#cupsHMACData">cupsHMACData</a></li>
+<li><a href="#cupsHashData">cupsHashData</a></li>
+<li><a href="#cupsHashString">cupsHashString</a></li>
+<li><a href="#cupsJSONDelete">cupsJSONDelete</a></li>
+<li><a href="#cupsJSONExportFile">cupsJSONExportFile</a></li>
+<li><a href="#cupsJSONExportString">cupsJSONExportString</a></li>
+<li><a href="#cupsJSONFind">cupsJSONFind</a></li>
+<li><a href="#cupsJSONGetChild">cupsJSONGetChild</a></li>
+<li><a href="#cupsJSONGetCount">cupsJSONGetCount</a></li>
+<li><a href="#cupsJSONGetKey">cupsJSONGetKey</a></li>
+<li><a href="#cupsJSONGetNumber">cupsJSONGetNumber</a></li>
+<li><a href="#cupsJSONGetParent">cupsJSONGetParent</a></li>
+<li><a href="#cupsJSONGetSibling">cupsJSONGetSibling</a></li>
+<li><a href="#cupsJSONGetString">cupsJSONGetString</a></li>
+<li><a href="#cupsJSONGetType">cupsJSONGetType</a></li>
+<li><a href="#cupsJSONImportFile">cupsJSONImportFile</a></li>
+<li><a href="#cupsJSONImportString">cupsJSONImportString</a></li>
+<li><a href="#cupsJSONImportURL">cupsJSONImportURL</a></li>
+<li><a href="#cupsJSONNew">cupsJSONNew</a></li>
+<li><a href="#cupsJSONNewKey">cupsJSONNewKey</a></li>
+<li><a href="#cupsJSONNewNumber">cupsJSONNewNumber</a></li>
+<li><a href="#cupsJSONNewString">cupsJSONNewString</a></li>
+<li><a href="#cupsJWTDelete">cupsJWTDelete</a></li>
+<li><a href="#cupsJWTExportString">cupsJWTExportString</a></li>
+<li><a href="#cupsJWTGetAlgorithm">cupsJWTGetAlgorithm</a></li>
+<li><a href="#cupsJWTGetClaimNumber">cupsJWTGetClaimNumber</a></li>
+<li><a href="#cupsJWTGetClaimString">cupsJWTGetClaimString</a></li>
+<li><a href="#cupsJWTGetClaimType">cupsJWTGetClaimType</a></li>
+<li><a href="#cupsJWTGetClaimValue">cupsJWTGetClaimValue</a></li>
+<li><a href="#cupsJWTGetClaims">cupsJWTGetClaims</a></li>
+<li><a href="#cupsJWTGetHeaderNumber">cupsJWTGetHeaderNumber</a></li>
+<li><a href="#cupsJWTGetHeaderString">cupsJWTGetHeaderString</a></li>
+<li><a href="#cupsJWTGetHeaderType">cupsJWTGetHeaderType</a></li>
+<li><a href="#cupsJWTGetHeaderValue">cupsJWTGetHeaderValue</a></li>
+<li><a href="#cupsJWTGetHeaders">cupsJWTGetHeaders</a></li>
+<li><a href="#cupsJWTHasValidSignature">cupsJWTHasValidSignature</a></li>
+<li><a href="#cupsJWTImportString">cupsJWTImportString</a></li>
+<li><a href="#cupsJWTMakePrivateKey">cupsJWTMakePrivateKey</a></li>
+<li><a href="#cupsJWTMakePublicKey">cupsJWTMakePublicKey</a></li>
+<li><a href="#cupsJWTNew">cupsJWTNew</a></li>
+<li><a href="#cupsJWTSetClaimNumber">cupsJWTSetClaimNumber</a></li>
+<li><a href="#cupsJWTSetClaimString">cupsJWTSetClaimString</a></li>
+<li><a href="#cupsJWTSetClaimValue">cupsJWTSetClaimValue</a></li>
+<li><a href="#cupsJWTSetHeaderNumber">cupsJWTSetHeaderNumber</a></li>
+<li><a href="#cupsJWTSetHeaderString">cupsJWTSetHeaderString</a></li>
+<li><a href="#cupsJWTSetHeaderValue">cupsJWTSetHeaderValue</a></li>
+<li><a href="#cupsJWTSign">cupsJWTSign</a></li>
+<li><a href="#cupsLangDefault">cupsLangDefault</a></li>
+<li><a href="#cupsLangEncoding">cupsLangEncoding</a></li>
+<li><a href="#cupsLangFlush">cupsLangFlush</a></li>
+<li><a href="#cupsLangFree">cupsLangFree</a></li>
+<li><a href="#cupsLangGet">cupsLangGet</a></li>
+<li><a href="#cupsLastError">cupsLastError</a></li>
+<li><a href="#cupsLastErrorString">cupsLastErrorString</a></li>
 <li><a href="#cupsLocalizeDestMedia">cupsLocalizeDestMedia</a></li>
 <li><a href="#cupsLocalizeDestOption">cupsLocalizeDestOption</a></li>
 <li><a href="#cupsLocalizeDestValue">cupsLocalizeDestValue</a></li>
-<li><a href="#cupsMakeServerCredentials">cupsMakeServerCredentials</a></li>
+<li><a href="#cupsMutexDestroy">cupsMutexDestroy</a></li>
+<li><a href="#cupsMutexInit">cupsMutexInit</a></li>
+<li><a href="#cupsMutexLock">cupsMutexLock</a></li>
+<li><a href="#cupsMutexUnlock">cupsMutexUnlock</a></li>
+<li><a href="#cupsNotifySubject">cupsNotifySubject</a></li>
+<li><a href="#cupsNotifyText">cupsNotifyText</a></li>
 <li><a href="#cupsParseOptions">cupsParseOptions</a></li>
+<li><a href="#cupsPutFd">cupsPutFd</a></li>
+<li><a href="#cupsPutFile">cupsPutFile</a></li>
+<li><a href="#cupsRWDestroy">cupsRWDestroy</a></li>
+<li><a href="#cupsRWInit">cupsRWInit</a></li>
+<li><a href="#cupsRWLockRead">cupsRWLockRead</a></li>
+<li><a href="#cupsRWLockWrite">cupsRWLockWrite</a></li>
+<li><a href="#cupsRWUnlock">cupsRWUnlock</a></li>
 <li><a href="#cupsRasterClose">cupsRasterClose</a></li>
-<li><a href="#cupsRasterErrorString">cupsRasterErrorString</a></li>
-<li><a href="#cupsRasterInitPWGHeader">cupsRasterInitPWGHeader</a></li>
+<li><a href="#cupsRasterGetErrorString">cupsRasterGetErrorString</a></li>
+<li><a href="#cupsRasterInitHeader">cupsRasterInitHeader</a></li>
 <li><a href="#cupsRasterOpen">cupsRasterOpen</a></li>
 <li><a href="#cupsRasterOpenIO">cupsRasterOpenIO</a></li>
 <li><a href="#cupsRasterReadHeader">cupsRasterReadHeader</a></li>
@@ -380,39 +508,55 @@ span.string {
 <li><a href="#cupsRasterWriteHeader">cupsRasterWriteHeader</a></li>
 <li><a href="#cupsRasterWriteHeader2">cupsRasterWriteHeader2</a></li>
 <li><a href="#cupsRasterWritePixels">cupsRasterWritePixels</a></li>
+<li><a href="#cupsReadResponseData">cupsReadResponseData</a></li>
 <li><a href="#cupsRemoveDest">cupsRemoveDest</a></li>
 <li><a href="#cupsRemoveOption">cupsRemoveOption</a></li>
+<li><a href="#cupsSaveCredentials">cupsSaveCredentials</a></li>
+<li><a href="#cupsSendRequest">cupsSendRequest</a></li>
 <li><a href="#cupsServer">cupsServer</a></li>
 <li><a href="#cupsSetClientCertCB">cupsSetClientCertCB</a></li>
 <li><a href="#cupsSetCredentials">cupsSetCredentials</a></li>
 <li><a href="#cupsSetDefaultDest">cupsSetDefaultDest</a></li>
 <li><a href="#cupsSetDests2">cupsSetDests2</a></li>
 <li><a href="#cupsSetEncryption">cupsSetEncryption</a></li>
+<li><a href="#cupsSetOAuthCB">cupsSetOAuthCB</a></li>
 <li><a href="#cupsSetPasswordCB2">cupsSetPasswordCB2</a></li>
 <li><a href="#cupsSetServer">cupsSetServer</a></li>
 <li><a href="#cupsSetServerCertCB">cupsSetServerCertCB</a></li>
 <li><a href="#cupsSetServerCredentials">cupsSetServerCredentials</a></li>
 <li><a href="#cupsSetUser">cupsSetUser</a></li>
 <li><a href="#cupsSetUserAgent">cupsSetUserAgent</a></li>
+<li><a href="#cupsSignCredentialsRequest">cupsSignCredentialsRequest</a></li>
 <li><a href="#cupsStartDestDocument">cupsStartDestDocument</a></li>
-<li><a href="#cupsGetUser">cupsGetUser</a></li>
-<li><a href="#cupsGetUserAgent">cupsGetUserAgent</a></li>
+<li><a href="#cupsTempFd">cupsTempFd</a></li>
+<li><a href="#cupsTempFile">cupsTempFile</a></li>
+<li><a href="#cupsTempFile2">cupsTempFile2</a></li>
+<li><a href="#cupsThreadCancel">cupsThreadCancel</a></li>
+<li><a href="#cupsThreadCreate">cupsThreadCreate</a></li>
+<li><a href="#cupsThreadDetach">cupsThreadDetach</a></li>
+<li><a href="#cupsThreadWait">cupsThreadWait</a></li>
+<li><a href="#cupsUTF32ToUTF8">cupsUTF32ToUTF8</a></li>
+<li><a href="#cupsUTF8ToCharset">cupsUTF8ToCharset</a></li>
+<li><a href="#cupsUTF8ToUTF32">cupsUTF8ToUTF32</a></li>
+<li><a href="#cupsUser">cupsUser</a></li>
+<li><a href="#cupsUserAgent">cupsUserAgent</a></li>
+<li><a href="#cupsWriteRequestData">cupsWriteRequestData</a></li>
 <li><a href="#httpAcceptConnection">httpAcceptConnection</a></li>
-<li><a href="#httpAddCredential">httpAddCredential</a></li>
-<li><a href="#httpAddrAny">httpAddrAny</a></li>
 <li><a href="#httpAddrClose">httpAddrClose</a></li>
 <li><a href="#httpAddrConnect2">httpAddrConnect2</a></li>
 <li><a href="#httpAddrCopyList">httpAddrCopyList</a></li>
-<li><a href="#httpAddrEqual">httpAddrEqual</a></li>
-<li><a href="#httpAddrFamily">httpAddrFamily</a></li>
 <li><a href="#httpAddrFreeList">httpAddrFreeList</a></li>
+<li><a href="#httpAddrGetFamily">httpAddrGetFamily</a></li>
+<li><a href="#httpAddrGetLength">httpAddrGetLength</a></li>
 <li><a href="#httpAddrGetList">httpAddrGetList</a></li>
-<li><a href="#httpAddrLength">httpAddrLength</a></li>
+<li><a href="#httpAddrGetPort">httpAddrGetPort</a></li>
+<li><a href="#httpAddrGetString">httpAddrGetString</a></li>
+<li><a href="#httpAddrIsAny">httpAddrIsAny</a></li>
+<li><a href="#httpAddrIsEqual">httpAddrIsEqual</a></li>
+<li><a href="#httpAddrIsLocalhost">httpAddrIsLocalhost</a></li>
 <li><a href="#httpAddrListen">httpAddrListen</a></li>
-<li><a href="#httpAddrLocalhost">httpAddrLocalhost</a></li>
 <li><a href="#httpAddrLookup">httpAddrLookup</a></li>
-<li><a href="#httpAddrPort">httpAddrPort</a></li>
-<li><a href="#httpAddrString">httpAddrString</a></li>
+<li><a href="#httpAddrSetPort">httpAddrSetPort</a></li>
 <li><a href="#httpAssembleURI">httpAssembleURI</a></li>
 <li><a href="#httpAssembleURIf">httpAssembleURIf</a></li>
 <li><a href="#httpAssembleUUID">httpAssembleUUID</a></li>
@@ -421,23 +565,13 @@ span.string {
 <li><a href="#httpClearCookie">httpClearCookie</a></li>
 <li><a href="#httpClearFields">httpClearFields</a></li>
 <li><a href="#httpClose">httpClose</a></li>
-<li><a href="#httpCompareCredentials">httpCompareCredentials</a></li>
 <li><a href="#httpConnect2">httpConnect2</a></li>
-<li><a href="#httpCopyCredentials">httpCopyCredentials</a></li>
-<li><a href="#httpCredentialsAreValidForName">httpCredentialsAreValidForName</a></li>
-<li><a href="#httpCredentialsGetExpiration">httpCredentialsGetExpiration</a></li>
-<li><a href="#httpCredentialsGetTrust">httpCredentialsGetTrust</a></li>
-<li><a href="#httpCredentialsString">httpCredentialsString</a></li>
-<li><a href="#httpDecode64_2">httpDecode64_2</a></li>
-<li><a href="#httpDelete">httpDelete</a></li>
-<li><a href="#httpEncode64_2">httpEncode64_2</a></li>
-<li><a href="#httpEncryption">httpEncryption</a></li>
-<li><a href="#httpError">httpError</a></li>
+<li><a href="#httpCopyPeerCredentials">httpCopyPeerCredentials</a></li>
+<li><a href="#httpDecode64_3">httpDecode64_3</a></li>
+<li><a href="#httpEncode64_3">httpEncode64_3</a></li>
 <li><a href="#httpFieldValue">httpFieldValue</a></li>
 <li><a href="#httpFlush">httpFlush</a></li>
 <li><a href="#httpFlushWrite">httpFlushWrite</a></li>
-<li><a href="#httpFreeCredentials">httpFreeCredentials</a></li>
-<li><a href="#httpGet">httpGet</a></li>
 <li><a href="#httpGetActivity">httpGetActivity</a></li>
 <li><a href="#httpGetAddress">httpGetAddress</a></li>
 <li><a href="#httpGetAuthString">httpGetAuthString</a></li>
@@ -447,6 +581,7 @@ span.string {
 <li><a href="#httpGetDateString2">httpGetDateString2</a></li>
 <li><a href="#httpGetDateTime">httpGetDateTime</a></li>
 <li><a href="#httpGetEncryption">httpGetEncryption</a></li>
+<li><a href="#httpGetError">httpGetError</a></li>
 <li><a href="#httpGetExpect">httpGetExpect</a></li>
 <li><a href="#httpGetFd">httpGetFd</a></li>
 <li><a href="#httpGetField">httpGetField</a></li>
@@ -460,26 +595,25 @@ span.string {
 <li><a href="#httpGetStatus">httpGetStatus</a></li>
 <li><a href="#httpGetSubField2">httpGetSubField2</a></li>
 <li><a href="#httpGetVersion">httpGetVersion</a></li>
-<li><a href="#httpGets">httpGets</a></li>
-<li><a href="#httpHead">httpHead</a></li>
+<li><a href="#httpGets2">httpGets2</a></li>
 <li><a href="#httpInitialize">httpInitialize</a></li>
 <li><a href="#httpIsChunked">httpIsChunked</a></li>
 <li><a href="#httpIsEncrypted">httpIsEncrypted</a></li>
-<li><a href="#httpLoadCredentials">httpLoadCredentials</a></li>
-<li><a href="#httpOptions">httpOptions</a></li>
+<li><a href="#httpMD5">httpMD5</a></li>
+<li><a href="#httpMD5Final">httpMD5Final</a></li>
+<li><a href="#httpMD5String">httpMD5String</a></li>
 <li><a href="#httpPeek">httpPeek</a></li>
-<li><a href="#httpPost">httpPost</a></li>
-<li><a href="#httpPut">httpPut</a></li>
 <li><a href="#httpRead2">httpRead2</a></li>
 <li><a href="#httpReadRequest">httpReadRequest</a></li>
 <li><a href="#httpReconnect2">httpReconnect2</a></li>
 <li><a href="#httpResolveHostname">httpResolveHostname</a></li>
-<li><a href="#httpSaveCredentials">httpSaveCredentials</a></li>
+<li><a href="#httpResolveURI">httpResolveURI</a></li>
 <li><a href="#httpSeparateURI">httpSeparateURI</a></li>
 <li><a href="#httpSetAuthString">httpSetAuthString</a></li>
+<li><a href="#httpSetBlocking">httpSetBlocking</a></li>
 <li><a href="#httpSetCookie">httpSetCookie</a></li>
-<li><a href="#httpSetCredentials">httpSetCredentials</a></li>
 <li><a href="#httpSetDefaultField">httpSetDefaultField</a></li>
+<li><a href="#httpSetEncryption">httpSetEncryption</a></li>
 <li><a href="#httpSetExpect">httpSetExpect</a></li>
 <li><a href="#httpSetField">httpSetField</a></li>
 <li><a href="#httpSetKeepAlive">httpSetKeepAlive</a></li>
@@ -487,16 +621,18 @@ span.string {
 <li><a href="#httpSetTimeout">httpSetTimeout</a></li>
 <li><a href="#httpShutdown">httpShutdown</a></li>
 <li><a href="#httpStateString">httpStateString</a></li>
-<li><a href="#httpStatus">httpStatus</a></li>
+<li><a href="#httpStatusString">httpStatusString</a></li>
 <li><a href="#httpURIStatusString">httpURIStatusString</a></li>
 <li><a href="#httpUpdate">httpUpdate</a></li>
 <li><a href="#httpWait">httpWait</a></li>
 <li><a href="#httpWrite2">httpWrite2</a></li>
+<li><a href="#httpWriteRequest">httpWriteRequest</a></li>
 <li><a href="#httpWriteResponse">httpWriteResponse</a></li>
 <li><a href="#ippAddBoolean">ippAddBoolean</a></li>
 <li><a href="#ippAddBooleans">ippAddBooleans</a></li>
 <li><a href="#ippAddCollection">ippAddCollection</a></li>
 <li><a href="#ippAddCollections">ippAddCollections</a></li>
+<li><a href="#ippAddCredentialsString">ippAddCredentialsString</a></li>
 <li><a href="#ippAddDate">ippAddDate</a></li>
 <li><a href="#ippAddInteger">ippAddInteger</a></li>
 <li><a href="#ippAddIntegers">ippAddIntegers</a></li>
@@ -516,6 +652,7 @@ span.string {
 <li><a href="#ippContainsString">ippContainsString</a></li>
 <li><a href="#ippCopyAttribute">ippCopyAttribute</a></li>
 <li><a href="#ippCopyAttributes">ippCopyAttributes</a></li>
+<li><a href="#ippCopyCredentialsString">ippCopyCredentialsString</a></li>
 <li><a href="#ippCreateRequestedArray">ippCreateRequestedArray</a></li>
 <li><a href="#ippDateToTime">ippDateToTime</a></li>
 <li><a href="#ippDelete">ippDelete</a></li>
@@ -525,18 +662,44 @@ span.string {
 <li><a href="#ippEnumValue">ippEnumValue</a></li>
 <li><a href="#ippErrorString">ippErrorString</a></li>
 <li><a href="#ippErrorValue">ippErrorValue</a></li>
+<li><a href="#ippFileClose">ippFileClose</a></li>
+<li><a href="#ippFileDelete">ippFileDelete</a></li>
+<li><a href="#ippFileExpandVars">ippFileExpandVars</a></li>
+<li><a href="#ippFileGetAttribute">ippFileGetAttribute</a></li>
+<li><a href="#ippFileGetAttributes">ippFileGetAttributes</a></li>
+<li><a href="#ippFileGetFilename">ippFileGetFilename</a></li>
+<li><a href="#ippFileGetLineNumber">ippFileGetLineNumber</a></li>
+<li><a href="#ippFileGetVar">ippFileGetVar</a></li>
+<li><a href="#ippFileNew">ippFileNew</a></li>
+<li><a href="#ippFileOpen">ippFileOpen</a></li>
+<li><a href="#ippFileRead">ippFileRead</a></li>
+<li><a href="#ippFileReadCollection">ippFileReadCollection</a></li>
+<li><a href="#ippFileReadToken">ippFileReadToken</a></li>
+<li><a href="#ippFileRestorePosition">ippFileRestorePosition</a></li>
+<li><a href="#ippFileSavePosition">ippFileSavePosition</a></li>
+<li><a href="#ippFileSetAttributes">ippFileSetAttributes</a></li>
+<li><a href="#ippFileSetGroupTag">ippFileSetGroupTag</a></li>
+<li><a href="#ippFileSetVar">ippFileSetVar</a></li>
+<li><a href="#ippFileSetVarf">ippFileSetVarf</a></li>
+<li><a href="#ippFileWriteAttributes">ippFileWriteAttributes</a></li>
+<li><a href="#ippFileWriteComment">ippFileWriteComment</a></li>
+<li><a href="#ippFileWriteToken">ippFileWriteToken</a></li>
+<li><a href="#ippFileWriteTokenf">ippFileWriteTokenf</a></li>
 <li><a href="#ippFindAttribute">ippFindAttribute</a></li>
 <li><a href="#ippFindNextAttribute">ippFindNextAttribute</a></li>
-<li><a href="#ippFirstAttribute">ippFirstAttribute</a></li>
 <li><a href="#ippGetBoolean">ippGetBoolean</a></li>
 <li><a href="#ippGetCollection">ippGetCollection</a></li>
 <li><a href="#ippGetCount">ippGetCount</a></li>
 <li><a href="#ippGetDate">ippGetDate</a></li>
+<li><a href="#ippGetFirstAttribute">ippGetFirstAttribute</a></li>
 <li><a href="#ippGetGroupTag">ippGetGroupTag</a></li>
 <li><a href="#ippGetInteger">ippGetInteger</a></li>
+<li><a href="#ippGetLength">ippGetLength</a></li>
 <li><a href="#ippGetName">ippGetName</a></li>
+<li><a href="#ippGetNextAttribute">ippGetNextAttribute</a></li>
 <li><a href="#ippGetOctetString">ippGetOctetString</a></li>
 <li><a href="#ippGetOperation">ippGetOperation</a></li>
+<li><a href="#ippGetPort">ippGetPort</a></li>
 <li><a href="#ippGetRange">ippGetRange</a></li>
 <li><a href="#ippGetRequestId">ippGetRequestId</a></li>
 <li><a href="#ippGetResolution">ippGetResolution</a></li>
@@ -545,17 +708,16 @@ span.string {
 <li><a href="#ippGetString">ippGetString</a></li>
 <li><a href="#ippGetValueTag">ippGetValueTag</a></li>
 <li><a href="#ippGetVersion">ippGetVersion</a></li>
-<li><a href="#ippLength">ippLength</a></li>
 <li><a href="#ippNew">ippNew</a></li>
 <li><a href="#ippNewRequest">ippNewRequest</a></li>
 <li><a href="#ippNewResponse">ippNewResponse</a></li>
-<li><a href="#ippNextAttribute">ippNextAttribute</a></li>
 <li><a href="#ippOpString">ippOpString</a></li>
 <li><a href="#ippOpValue">ippOpValue</a></li>
-<li><a href="#ippPort">ippPort</a></li>
 <li><a href="#ippRead">ippRead</a></li>
 <li><a href="#ippReadFile">ippReadFile</a></li>
 <li><a href="#ippReadIO">ippReadIO</a></li>
+<li><a href="#ippRestore">ippRestore</a></li>
+<li><a href="#ippSave">ippSave</a></li>
 <li><a href="#ippSetBoolean">ippSetBoolean</a></li>
 <li><a href="#ippSetCollection">ippSetCollection</a></li>
 <li><a href="#ippSetDate">ippSetDate</a></li>
@@ -584,28 +746,61 @@ span.string {
 <li><a href="#ippWrite">ippWrite</a></li>
 <li><a href="#ippWriteFile">ippWriteFile</a></li>
 <li><a href="#ippWriteIO">ippWriteIO</a></li>
+<li><a href="#pwgFormatSizeName">pwgFormatSizeName</a></li>
+<li><a href="#pwgInitSize">pwgInitSize</a></li>
+<li><a href="#pwgMediaForLegacy">pwgMediaForLegacy</a></li>
+<li><a href="#pwgMediaForPPD">pwgMediaForPPD</a></li>
+<li><a href="#pwgMediaForPWG">pwgMediaForPWG</a></li>
+<li><a href="#pwgMediaForSize">pwgMediaForSize</a></li>
 </ul></li>
 <li><a href="#TYPES">Data Types</a><ul class="subcontents">
-<li><a href="#cups_acopy_func_t">cups_acopy_func_t</a></li>
+<li><a href="#cups_acopy_cb_t">cups_acopy_cb_t</a></li>
 <li><a href="#cups_adv_t">cups_adv_t</a></li>
-<li><a href="#cups_afree_func_t">cups_afree_func_t</a></li>
-<li><a href="#cups_ahash_func_t">cups_ahash_func_t</a></li>
-<li><a href="#cups_array_func_t">cups_array_func_t</a></li>
+<li><a href="#cups_afree_cb_t">cups_afree_cb_t</a></li>
+<li><a href="#cups_ahash_cb_t">cups_ahash_cb_t</a></li>
+<li><a href="#cups_array_cb_t">cups_array_cb_t</a></li>
 <li><a href="#cups_array_t">cups_array_t</a></li>
 <li><a href="#cups_bool_t">cups_bool_t</a></li>
+<li><a href="#cups_cert_san_cb_t">cups_cert_san_cb_t</a></li>
 <li><a href="#cups_client_cert_cb_t">cups_client_cert_cb_t</a></li>
+<li><a href="#cups_cond_t">cups_cond_t</a></li>
+<li><a href="#cups_credpurpose_t">cups_credpurpose_t</a></li>
+<li><a href="#cups_credtype_t">cups_credtype_t</a></li>
+<li><a href="#cups_credusage_t">cups_credusage_t</a></li>
 <li><a href="#cups_cspace_t">cups_cspace_t</a></li>
 <li><a href="#cups_cut_t">cups_cut_t</a></li>
+<li><a href="#cups_dbcs_t">cups_dbcs_t</a></li>
 <li><a href="#cups_dentry_t">cups_dentry_t</a></li>
 <li><a href="#cups_dest_cb_t">cups_dest_cb_t</a></li>
+<li><a href="#cups_dest_flags_t">cups_dest_flags_t</a></li>
 <li><a href="#cups_dest_t">cups_dest_t</a></li>
 <li><a href="#cups_dinfo_t">cups_dinfo_t</a></li>
 <li><a href="#cups_dir_t">cups_dir_t</a></li>
+<li><a href="#cups_dnssd_browse_cb_t">cups_dnssd_browse_cb_t</a></li>
+<li><a href="#cups_dnssd_error_cb_t">cups_dnssd_error_cb_t</a></li>
+<li><a href="#cups_dnssd_flags_t">cups_dnssd_flags_t</a></li>
+<li><a href="#cups_dnssd_query_cb_t">cups_dnssd_query_cb_t</a></li>
+<li><a href="#cups_dnssd_query_t">cups_dnssd_query_t</a></li>
+<li><a href="#cups_dnssd_resolve_cb_t">cups_dnssd_resolve_cb_t</a></li>
+<li><a href="#cups_dnssd_resolve_t">cups_dnssd_resolve_t</a></li>
+<li><a href="#cups_dnssd_browse_t">cups_dnssd_browse_t</a></li>
+<li><a href="#cups_dnssd_service_cb_t">cups_dnssd_service_cb_t</a></li>
+<li><a href="#cups_dnssd_service_t">cups_dnssd_service_t</a></li>
+<li><a href="#cups_dnssd_t">cups_dnssd_t</a></li>
 <li><a href="#cups_edge_t">cups_edge_t</a></li>
 <li><a href="#cups_file_t">cups_file_t</a></li>
 <li><a href="#cups_job_t">cups_job_t</a></li>
 <li><a href="#cups_jog_t">cups_jog_t</a></li>
-<li><a href="#cups_mode_t">cups_mode_t</a></li>
+<li><a href="#cups_json_t">cups_json_t</a></li>
+<li><a href="#cups_jtype_t">cups_jtype_t</a></li>
+<li><a href="#cups_jwa_t">cups_jwa_t</a></li>
+<li><a href="#cups_jws_format_t">cups_jws_format_t</a></li>
+<li><a href="#cups_jwt_t">cups_jwt_t</a></li>
+<li><a href="#cups_lang_t">cups_lang_t</a></li>
+<li><a href="#cups_media_flags_t">cups_media_flags_t</a></li>
+<li><a href="#cups_media_t">cups_media_t</a></li>
+<li><a href="#cups_mutex_t">cups_mutex_t</a></li>
+<li><a href="#cups_oauth_cb_t">cups_oauth_cb_t</a></li>
 <li><a href="#cups_option_t">cups_option_t</a></li>
 <li><a href="#cups_order_t">cups_order_t</a></li>
 <li><a href="#cups_orient_t">cups_orient_t</a></li>
@@ -613,15 +808,29 @@ span.string {
 <li><a href="#cups_page_header_t">cups_page_header_t</a></li>
 <li><a href="#cups_password_cb2_t">cups_password_cb2_t</a></li>
 <li><a href="#cups_ptype_t">cups_ptype_t</a></li>
-<li><a href="#cups_raster_iocb_t">cups_raster_iocb_t</a></li>
+<li><a href="#cups_raster_cb_t">cups_raster_cb_t</a></li>
+<li><a href="#cups_raster_mode_t">cups_raster_mode_t</a></li>
 <li><a href="#cups_raster_t">cups_raster_t</a></li>
+<li><a href="#cups_rwlock_t">cups_rwlock_t</a></li>
+<li><a href="#cups_sbcs_t">cups_sbcs_t</a></li>
 <li><a href="#cups_server_cert_cb_t">cups_server_cert_cb_t</a></li>
 <li><a href="#cups_size_t">cups_size_t</a></li>
+<li><a href="#cups_thread_func_t">cups_thread_func_t</a></li>
+<li><a href="#cups_thread_key_t">cups_thread_key_t</a></li>
+<li><a href="#cups_thread_t">cups_thread_t</a></li>
+<li><a href="#cups_ucs2_t">cups_ucs2_t</a></li>
+<li><a href="#cups_ucs4_t">cups_ucs4_t</a></li>
+<li><a href="#cups_utf32_t">cups_utf32_t</a></li>
+<li><a href="#cups_utf8_t">cups_utf8_t</a></li>
+<li><a href="#cups_vbcs_t">cups_vbcs_t</a></li>
+<li><a href="#cups_whichjobs_t">cups_whichjobs_t</a></li>
 <li><a href="#http_addr_t">http_addr_t</a></li>
 <li><a href="#http_encoding_t">http_encoding_t</a></li>
 <li><a href="#http_encryption_t">http_encryption_t</a></li>
 <li><a href="#http_field_t">http_field_t</a></li>
 <li><a href="#http_keepalive_t">http_keepalive_t</a></li>
+<li><a href="#http_resolve_cb_t">http_resolve_cb_t</a></li>
+<li><a href="#http_resolve_t">http_resolve_t</a></li>
 <li><a href="#http_state_t">http_state_t</a></li>
 <li><a href="#http_t">http_t</a></li>
 <li><a href="#http_timeout_cb_t">http_timeout_cb_t</a></li>
@@ -629,8 +838,14 @@ span.string {
 <li><a href="#http_uri_coding_t">http_uri_coding_t</a></li>
 <li><a href="#http_uri_status_t">http_uri_status_t</a></li>
 <li><a href="#ipp_attribute_t">ipp_attribute_t</a></li>
-<li><a href="#ipp_copycb_t">ipp_copycb_t</a></li>
-<li><a href="#ipp_iocb_t">ipp_iocb_t</a></li>
+<li><a href="#ipp_copy_cb_t">ipp_copy_cb_t</a></li>
+<li><a href="#ipp_fattr_cb_t">ipp_fattr_cb_t</a></li>
+<li><a href="#ipp_ferror_cb_t">ipp_ferror_cb_t</a></li>
+<li><a href="#ipp_file_t">ipp_file_t</a></li>
+<li><a href="#ipp_ftoken_cb_t">ipp_ftoken_cb_t</a></li>
+<li><a href="#ipp_io_cb_t">ipp_io_cb_t</a></li>
+<li><a href="#ipp_jstate_t">ipp_jstate_t</a></li>
+<li><a href="#ipp_op_t">ipp_op_t</a></li>
 <li><a href="#ipp_orient_t">ipp_orient_t</a></li>
 <li><a href="#ipp_pstate_t">ipp_pstate_t</a></li>
 <li><a href="#ipp_quality_t">ipp_quality_t</a></li>
@@ -645,6 +860,8 @@ span.string {
 <li><a href="#cups_dentry_s">cups_dentry_s</a></li>
 <li><a href="#cups_dest_s">cups_dest_s</a></li>
 <li><a href="#cups_job_s">cups_job_s</a></li>
+<li><a href="#cups_lang_s">cups_lang_s</a></li>
+<li><a href="#cups_media_s">cups_media_s</a></li>
 <li><a href="#cups_option_s">cups_option_s</a></li>
 <li><a href="#cups_page_header2_s">cups_page_header2_s</a></li>
 <li><a href="#cups_page_header_s">cups_page_header_s</a></li>
@@ -654,18 +871,30 @@ span.string {
 <li><a href="#ENUMERATIONS">Enumerations</a><ul class="subcontents">
 <li><a href="#cups_adv_e">cups_adv_e</a></li>
 <li><a href="#cups_bool_e">cups_bool_e</a></li>
+<li><a href="#cups_credpurpose_e">cups_credpurpose_e</a></li>
+<li><a href="#cups_credtype_e">cups_credtype_e</a></li>
+<li><a href="#cups_credusage_e">cups_credusage_e</a></li>
 <li><a href="#cups_cspace_e">cups_cspace_e</a></li>
 <li><a href="#cups_cut_e">cups_cut_e</a></li>
+<li><a href="#cups_dest_flags_e">cups_dest_flags_e</a></li>
+<li><a href="#cups_dnssd_flags_e">cups_dnssd_flags_e</a></li>
+<li><a href="#cups_dnssd_rrtype_e">cups_dnssd_rrtype_e</a></li>
 <li><a href="#cups_edge_e">cups_edge_e</a></li>
 <li><a href="#cups_jog_e">cups_jog_e</a></li>
-<li><a href="#cups_mode_e">cups_mode_e</a></li>
+<li><a href="#cups_jtype_e">cups_jtype_e</a></li>
+<li><a href="#cups_jwa_e">cups_jwa_e</a></li>
+<li><a href="#cups_jws_format_e">cups_jws_format_e</a></li>
+<li><a href="#cups_media_flags_e">cups_media_flags_e</a></li>
 <li><a href="#cups_order_e">cups_order_e</a></li>
 <li><a href="#cups_orient_e">cups_orient_e</a></li>
 <li><a href="#cups_ptype_e">cups_ptype_e</a></li>
+<li><a href="#cups_raster_mode_e">cups_raster_mode_e</a></li>
+<li><a href="#cups_whichjobs_e">cups_whichjobs_e</a></li>
 <li><a href="#http_encoding_e">http_encoding_e</a></li>
 <li><a href="#http_encryption_e">http_encryption_e</a></li>
 <li><a href="#http_field_e">http_field_e</a></li>
 <li><a href="#http_keepalive_e">http_keepalive_e</a></li>
+<li><a href="#http_resolve_e">http_resolve_e</a></li>
 <li><a href="#http_state_e">http_state_e</a></li>
 <li><a href="#http_status_e">http_status_e</a></li>
 <li><a href="#http_trust_e">http_trust_e</a></li>
@@ -759,43 +988,43 @@ int main(void)
 <p>The <code>flags</code> argument specifies enumeration options, which at present must be <code>CUPS_DEST_FLAGS_NONE</code>.</p>
 <p>The <code>msec</code> argument specifies the maximum amount of time that should be used for enumeration in milliseconds - interactive applications should keep this value to 5000 or less when run on the main thread.</p>
 <p>The <code>cancel</code> argument points to an integer variable that, when set to a non-zero value, will cause enumeration to stop as soon as possible. It can be <code>NULL</code> if not needed.</p>
-<p>The <code>type</code> and <code>mask</code> arguments are bitfields that allow the caller to filter the destinations based on categories and/or capabilities. The destination's &quot;printer-type&quot; value is masked by the <code>mask</code> value and compared to the <code>type</code> value when filtering. For example, to only enumerate destinations that are hosted on the local system, pass <code>CUPS_PRINTER_LOCAL</code> for the <code>type</code> argument and <code>CUPS_PRINTER_DISCOVERED</code> for the <code>mask</code> argument. The following constants can be used for filtering:</p>
+<p>The <code>type</code> and <code>mask</code> arguments are bitfields that allow the caller to filter the destinations based on categories and/or capabilities. The destination's &quot;printer-type&quot; value is masked by the <code>mask</code> value and compared to the <code>type</code> value when filtering. For example, to only enumerate destinations that are hosted on the local system, pass <code>CUPS_PTYPE_LOCAL</code> for the <code>type</code> argument and <code>CUPS_PTYPE_DISCOVERED</code> for the <code>mask</code> argument. The following constants can be used for filtering:</p>
 <ul>
-<li><p><code>CUPS_PRINTER_CLASS</code>: A collection of destinations.</p>
+<li><p><code>CUPS_PTYPE_CLASS</code>: A collection of destinations.</p>
 </li>
-<li><p><code>CUPS_PRINTER_FAX</code>: A facsimile device.</p>
+<li><p><code>CUPS_PTYPE_FAX</code>: A facsimile device.</p>
 </li>
-<li><p><code>CUPS_PRINTER_LOCAL</code>: A local printer or class. This constant has the value 0 (no bits set) and is only used for the <code>type</code> argument and is paired with the <code>CUPS_PRINTER_REMOTE</code> or <code>CUPS_PRINTER_DISCOVERED</code> constant passed in the <code>mask</code> argument.</p>
+<li><p><code>CUPS_PTYPE_LOCAL</code>: A local printer or class. This constant has the value 0 (no bits set) and is only used for the <code>type</code> argument and is paired with the <code>CUPS_PTYPE_REMOTE</code> or <code>CUPS_PTYPE_DISCOVERED</code> constant passed in the <code>mask</code> argument.</p>
 </li>
-<li><p><code>CUPS_PRINTER_REMOTE</code>: A remote (shared) printer or class.</p>
+<li><p><code>CUPS_PTYPE_REMOTE</code>: A remote (shared) printer or class.</p>
 </li>
-<li><p><code>CUPS_PRINTER_DISCOVERED</code>: An available network printer or class.</p>
+<li><p><code>CUPS_PTYPE_DISCOVERED</code>: An available network printer or class.</p>
 </li>
-<li><p><code>CUPS_PRINTER_BW</code>: Can do B&amp;W printing.</p>
+<li><p><code>CUPS_PTYPE_BW</code>: Can do B&amp;W printing.</p>
 </li>
-<li><p><code>CUPS_PRINTER_COLOR</code>: Can do color printing.</p>
+<li><p><code>CUPS_PTYPE_COLOR</code>: Can do color printing.</p>
 </li>
-<li><p><code>CUPS_PRINTER_DUPLEX</code>: Can do two-sided printing.</p>
+<li><p><code>CUPS_PTYPE_DUPLEX</code>: Can do two-sided printing.</p>
 </li>
-<li><p><code>CUPS_PRINTER_STAPLE</code>: Can staple output.</p>
+<li><p><code>CUPS_PTYPE_STAPLE</code>: Can staple output.</p>
 </li>
-<li><p><code>CUPS_PRINTER_COLLATE</code>: Can quickly collate copies.</p>
+<li><p><code>CUPS_PTYPE_COLLATE</code>: Can quickly collate copies.</p>
 </li>
-<li><p><code>CUPS_PRINTER_PUNCH</code>: Can punch output.</p>
+<li><p><code>CUPS_PTYPE_PUNCH</code>: Can punch output.</p>
 </li>
-<li><p><code>CUPS_PRINTER_COVER</code>: Can cover output.</p>
+<li><p><code>CUPS_PTYPE_COVER</code>: Can cover output.</p>
 </li>
-<li><p><code>CUPS_PRINTER_BIND</code>: Can bind output.</p>
+<li><p><code>CUPS_PTYPE_BIND</code>: Can bind output.</p>
 </li>
-<li><p><code>CUPS_PRINTER_SORT</code>: Can sort output (mailboxes, etc.)</p>
+<li><p><code>CUPS_PTYPE_SORT</code>: Can sort output (mailboxes, etc.)</p>
 </li>
-<li><p><code>CUPS_PRINTER_SMALL</code>: Can print on Letter/Legal/A4-size media.</p>
+<li><p><code>CUPS_PTYPE_SMALL</code>: Can print on Letter/Legal/A4-size media.</p>
 </li>
-<li><p><code>CUPS_PRINTER_MEDIUM</code>: Can print on Tabloid/B/C/A3/A2-size media.</p>
+<li><p><code>CUPS_PTYPE_MEDIUM</code>: Can print on Tabloid/B/C/A3/A2-size media.</p>
 </li>
-<li><p><code>CUPS_PRINTER_LARGE</code>: Can print on D/E/A1/A0-size media.</p>
+<li><p><code>CUPS_PTYPE_LARGE</code>: Can print on D/E/A1/A0-size media.</p>
 </li>
-<li><p><code>CUPS_PRINTER_VARIABLE</code>: Can print on rolls and custom-size media.</p>
+<li><p><code>CUPS_PTYPE_VARIABLE</code>: Can print on rolls and custom-size media.</p>
 </li>
 </ul>
 <p>The <code>cb</code> argument specifies a function to call for every destination that is found:</p>
@@ -809,7 +1038,7 @@ int main(void)
 </li>
 <li><p><code>CUPS_DEST_FLAGS_REMOVED</code>: The destination has gone away and should be removed from the list of destinations a user can select.</p>
 </li>
-<li><p><code>CUPS_DEST_FLAGS_ERROR</code>: An error occurred. The reason for the error can be found by calling the <code>cupsGetError</code> and/or <code>cupsGetErrorString</code> functions.</p>
+<li><p><code>CUPS_DEST_FLAGS_ERROR</code>: An error occurred. The reason for the error can be found by calling the <code>cupsLastError</code> and/or <code>cupsLastErrorString</code> functions.</p>
 </li>
 </ul>
 <p>The callback function returns 0 to stop enumeration or 1 to continue.</p>
@@ -1179,7 +1408,7 @@ if (cupsCreateDestJob(CUPS_HTTP_DEFAULT, dest, info,
   printf(&quot;Created job: %d\n&quot;, job_id);
 else
   printf(&quot;Unable to create job: %s\n&quot;,
-         cupsGetErrorString());
+         cupsLastErrorString());
 </code></pre>
 <p>Once the job is created, you submit documents for the job using the <code>cupsStartDestDocument</code>, <code>cupsWriteRequestData</code>, and <code>cupsFinishDestDocument</code> functions:</p>
 <pre><code>http_status_t
@@ -1230,7 +1459,7 @@ if (cupsStartDestDocument(CUPS_HTTP_DEFAULT, dest, info,
     puts(&quot;Document send succeeded.&quot;);
   else
     printf(&quot;Document send failed: %s\n&quot;,
-           cupsGetErrorString());
+           cupsLastErrorString());
 }
 
 fclose(fp);
@@ -1328,17 +1557,17 @@ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
                                     filename);
 </code></pre>
 <p>Both <code>cupsDoRequest</code> and <code>cupsDoFileRequest</code> free the IPP request. If a valid IPP response is received, it is stored in a new IPP message (<code>ipp_t</code>) and returned to the caller. Otherwise <code>NULL</code> is returned.</p>
-<p>The status from the most recent request can be queried using the <code>cupsGetError</code> function, for example:</p>
-<pre><code>if (cupsGetError() &gt;= IPP_STATUS_ERROR_BAD_REQUEST)
+<p>The status from the most recent request can be queried using the <code>cupsLastError</code> function, for example:</p>
+<pre><code>if (cupsLastError() &gt;= IPP_STATUS_ERROR_BAD_REQUEST)
 {
   /* request failed */
 }
 </code></pre>
-<p>A human-readable error message is also available using the <code>cupsGetErrorString</code> function:</p>
-<pre><code>if (cupsGetError() &gt;= IPP_STATUS_ERROR_BAD_REQUEST)
+<p>A human-readable error message is also available using the <code>cupsLastErrorString</code> function:</p>
+<pre><code>if (cupsLastError() &gt;= IPP_STATUS_ERROR_BAD_REQUEST)
 {
   /* request failed */
-  printf(&quot;Request failed: %s\n&quot;, cupsGetErrorString());
+  printf(&quot;Request failed: %s\n&quot;, cupsLastErrorString());
 }
 </code></pre>
 <h3 class="title" id="processing-the-ipp-response">Processing the IPP Response</h3>
@@ -1395,6 +1624,21 @@ cups_password_cb2(const char *prompt, http_t *http,
 <p>The <code>resource</code> argument specifies the path used for the request.</p>
 <p>The <code>user_data</code> argument provides the user data pointer from the <code>cupsSetPasswordCB2</code> call.</p>
 <h2 class="title"><a id="FUNCTIONS">Functions</a></h2>
+<h3 class="function"><a id="DllMain">DllMain</a></h3>
+<p class="description">Main entry for library.</p>
+<p class="code">
+BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>hinst</th>
+<td class="description">DLL module handle</td></tr>
+<tr><th>reason</th>
+<td class="description">Reason</td></tr>
+<tr><th>reserved</th>
+<td class="description">Unused</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Success/failure</p>
 <h3 class="function"><a id="cupsAddDest">cupsAddDest</a></h3>
 <p class="description">Add a destination to the list of destinations.</p>
 <p class="code">
@@ -1446,6 +1690,29 @@ int cupsAddDestMediaOptions(<a href="#http_t">http_t</a> *http, <a href="#cups_d
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New number of options</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsAddDestMediaOptions2">cupsAddDestMediaOptions2</a></h3>
+<p class="description">Add the options corresponding to the specified media information.</p>
+<p class="code">
+int cupsAddDestMediaOptions2(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, unsigned flags, <a href="#cups_media_t">cups_media_t</a> *media, int num_options, <a href="#cups_option_t">cups_option_t</a> **options);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>flags</th>
+<td class="description">Media matching flags</td></tr>
+<tr><th>media</th>
+<td class="description">Media information</td></tr>
+<tr><th>num_options</th>
+<td class="description">Current number of options</td></tr>
+<tr><th>options</th>
+<td class="description">Options</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New number of options</p>
 <h3 class="function"><span class="info">&#160;CUPS 2.2.4/macOS 10.13&#160;</span><a id="cupsAddIntegerOption">cupsAddIntegerOption</a></h3>
 <p class="description">Add an integer option to an option array.</p>
 <p class="code">
@@ -1488,6 +1755,20 @@ int cupsAddOption(const char *name, const char *value, int num_options, <a href=
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">New option arrays can be initialized simply by passing 0 for the
 &quot;num_options&quot; parameter.</p>
+<h3 class="function"><a id="cupsAreCredentialsValidForName">cupsAreCredentialsValidForName</a></h3>
+<p class="description">Return whether the credentials are valid
+                                     for the given name.</p>
+<p class="code">
+bool cupsAreCredentialsValidForName(const char *common_name, const char *credentials);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>common_name</th>
+<td class="description">Name to check</td></tr>
+<tr><th>credentials</th>
+<td class="description">Credentials</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> if valid, <code>false</code> otherwise</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayAdd">cupsArrayAdd</a></h3>
 <p class="description">Add an element to the array.</p>
 <p class="code">
@@ -1507,46 +1788,40 @@ appended at the end of the run of identical elements.  For unsorted arrays,
 the element is appended to the end of the array.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayClear">cupsArrayClear</a></h3>
-<p class="description">Clear the array.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayAddStrings">cupsArrayAddStrings</a></h3>
+<p class="description">Add zero or more delimited strings to an array.</p>
 <p class="code">
-void cupsArrayClear(<a href="#cups_array_t">cups_array_t</a> *a);</p>
+bool cupsArrayAddStrings(<a href="#cups_array_t">cups_array_t</a> *a, const char *s, char delim);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>a</th>
 <td class="description">Array</td></tr>
+<tr><th>s</th>
+<td class="description">Delimited strings or NULL</td></tr>
+<tr><th>delim</th>
+<td class="description">Delimiter character</td></tr>
 </tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is equivalent to removing all elements in the array.
-The caller is responsible for freeing the memory used by the
-elements themselves.
+<p class="discussion">Note: The array MUST be created using the <a href="#_cupsArrayNewStrings"><code>_cupsArrayNewStrings</code></a>
+function. Duplicate strings are NOT added. If the string pointer &quot;s&quot; is NULL
+or the empty string, no strings are added to the array.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayCount">cupsArrayCount</a></h3>
-<p class="description">Get the number of elements in the array.</p>
-<p class="code">
-int cupsArrayCount(<a href="#cups_array_t">cups_array_t</a> *a);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>a</th>
-<td class="description">Array</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of elements</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayCurrent">cupsArrayCurrent</a></h3>
-<p class="description">Return the current element in the array.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayClear">cupsArrayClear</a></h3>
+<p class="description">Clear the array.</p>
 <p class="code">
-void *cupsArrayCurrent(<a href="#cups_array_t">cups_array_t</a> *a);</p>
+void cupsArrayClear(<a href="#cups_array_t">cups_array_t</a> *a);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>a</th>
 <td class="description">Array</td></tr>
 </tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Element</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The current element is undefined until you call <a href="#cupsArrayFind"><code>cupsArrayFind</code></a>,
-<a href="#cupsArrayFirst"><code>cupsArrayFirst</code></a>, or <a href="#cupsArrayIndex"><code>cupsArrayIndex</code></a>, or <a href="#cupsArrayLast"><code>cupsArrayLast</code></a>.
+<p class="discussion">This function is equivalent to removing all elements in the array.
+The caller is responsible for freeing the memory used by the
+elements themselves.
 
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayDelete">cupsArrayDelete</a></h3>
@@ -1587,10 +1862,50 @@ void *cupsArrayFind(<a href="#cups_array_t">cups_array_t</a> *a, void *e);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Element found or <code>NULL</code></p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayFirst">cupsArrayFirst</a></h3>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayGetCount">cupsArrayGetCount</a></h3>
+<p class="description">Get the number of elements in the array.</p>
+<p class="code">
+int cupsArrayGetCount(<a href="#cups_array_t">cups_array_t</a> *a);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>a</th>
+<td class="description">Array</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of elements</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayGetCurrent">cupsArrayGetCurrent</a></h3>
+<p class="description">Return the current element in the array.</p>
+<p class="code">
+void *cupsArrayGetCurrent(<a href="#cups_array_t">cups_array_t</a> *a);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>a</th>
+<td class="description">Array</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Element</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The current element is undefined until you call <a href="#cupsArrayFind"><code>cupsArrayFind</code></a>,
+<a href="#cupsArrayFirst"><code>cupsArrayFirst</code></a>, or <a href="#cupsArrayIndex"><code>cupsArrayIndex</code></a>, or <a href="#cupsArrayLast"><code>cupsArrayLast</code></a>.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayGetElement">cupsArrayGetElement</a></h3>
+<p class="description">Get the N-th element in the array.</p>
+<p class="code">
+void *cupsArrayGetElement(<a href="#cups_array_t">cups_array_t</a> *a, int n);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>a</th>
+<td class="description">Array</td></tr>
+<tr><th>n</th>
+<td class="description">Index into array, starting at 0</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">N-th element or <code>NULL</code></p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayGetFirst">cupsArrayGetFirst</a></h3>
 <p class="description">Get the first element in the array.</p>
 <p class="code">
-void *cupsArrayFirst(<a href="#cups_array_t">cups_array_t</a> *a);</p>
+void *cupsArrayGetFirst(<a href="#cups_array_t">cups_array_t</a> *a);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>a</th>
@@ -1625,169 +1940,141 @@ int cupsArrayGetInsert(<a href="#cups_array_t">cups_array_t</a> *a);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Index of the last inserted element, starting at 0</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayIndex">cupsArrayIndex</a></h3>
-<p class="description">Get the N-th element in the array.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayGetLast">cupsArrayGetLast</a></h3>
+<p class="description">Get the last element in the array.</p>
 <p class="code">
-void *cupsArrayIndex(<a href="#cups_array_t">cups_array_t</a> *a, int n);</p>
+void *cupsArrayGetLast(<a href="#cups_array_t">cups_array_t</a> *a);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>a</th>
 <td class="description">Array</td></tr>
-<tr><th>n</th>
-<td class="description">Index into array, starting at 0</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">N-th element or <code>NULL</code></p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayInsert">cupsArrayInsert</a></h3>
-<p class="description">Insert an element in the array.</p>
+<p class="description">Last element or <code>NULL</code> if the array is empty</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayGetNext">cupsArrayGetNext</a></h3>
+<p class="description">Get the next element in the array.</p>
 <p class="code">
-int cupsArrayInsert(<a href="#cups_array_t">cups_array_t</a> *a, void *e);</p>
+void *cupsArrayGetNext(<a href="#cups_array_t">cups_array_t</a> *a);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>a</th>
 <td class="description">Array</td></tr>
-<tr><th>e</th>
-<td class="description">Element</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on failure, 1 on success</p>
+<p class="description">Next element or <code>NULL</code></p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">When inserting an element in a sorted array, non-unique elements are
-inserted at the beginning of the run of identical elements.  For unsorted
-arrays, the element is inserted at the beginning of the array.
+<p class="discussion">This function is equivalent to &quot;cupsArrayIndex(a, cupsArrayGetIndex(a) + 1)&quot;.<br>
+<br>
+The next element is undefined until you call <a href="#cupsArrayFind"><code>cupsArrayFind</code></a>,
+<a href="#cupsArrayFirst"><code>cupsArrayFirst</code></a>, or <a href="#cupsArrayIndex"><code>cupsArrayIndex</code></a>, or <a href="#cupsArrayLast"><code>cupsArrayLast</code></a>
+to set the current element.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayLast">cupsArrayLast</a></h3>
-<p class="description">Get the last element in the array.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayGetPrev">cupsArrayGetPrev</a></h3>
+<p class="description">Get the previous element in the array.</p>
 <p class="code">
-void *cupsArrayLast(<a href="#cups_array_t">cups_array_t</a> *a);</p>
+void *cupsArrayGetPrev(<a href="#cups_array_t">cups_array_t</a> *a);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>a</th>
 <td class="description">Array</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Last element or <code>NULL</code> if the array is empty</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayNew">cupsArrayNew</a></h3>
-<p class="description">Create a new array.</p>
+<p class="description">Previous element or <code>NULL</code></p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function is equivalent to &quot;cupsArrayIndex(a, cupsArrayGetIndex(a) - 1)&quot;.<br>
+<br>
+The previous element is undefined until you call <a href="#cupsArrayFind"><code>cupsArrayFind</code></a>,
+<a href="#cupsArrayFirst"><code>cupsArrayFirst</code></a>, or <a href="#cupsArrayIndex"><code>cupsArrayIndex</code></a>, or <a href="#cupsArrayLast"><code>cupsArrayLast</code></a>
+to set the current element.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayGetUserData">cupsArrayGetUserData</a></h3>
+<p class="description">Return the user data for an array.</p>
 <p class="code">
-<a href="#cups_array_t">cups_array_t</a> *cupsArrayNew(<a href="#cups_array_func_t">cups_array_func_t</a> f, void *d);</p>
+void *cupsArrayGetUserData(<a href="#cups_array_t">cups_array_t</a> *a);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>f</th>
-<td class="description">Comparison function or <code>NULL</code> for an unsorted array</td></tr>
-<tr><th>d</th>
-<td class="description">User data pointer or <code>NULL</code></td></tr>
+<tr><th>a</th>
+<td class="description">Array</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Array</p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">The comparison function (&quot;f&quot;) is used to create a sorted array. The function
-receives pointers to two elements and the user data pointer (&quot;d&quot;) - the user
-data pointer argument can safely be omitted when not required so functions
-like <code>strcmp</code> can be used for sorted string arrays.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.3/macOS 10.5&#160;</span><a id="cupsArrayNew2">cupsArrayNew2</a></h3>
-<p class="description">Create a new array with hash.</p>
+<p class="description">User data</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayInsert">cupsArrayInsert</a></h3>
+<p class="description">Insert an element in the array.</p>
 <p class="code">
-<a href="#cups_array_t">cups_array_t</a> *cupsArrayNew2(<a href="#cups_array_func_t">cups_array_func_t</a> f, void *d, <a href="#cups_ahash_func_t">cups_ahash_func_t</a> h, int hsize);</p>
+int cupsArrayInsert(<a href="#cups_array_t">cups_array_t</a> *a, void *e);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>f</th>
-<td class="description">Comparison function or <code>NULL</code> for an unsorted array</td></tr>
-<tr><th>d</th>
-<td class="description">User data or <code>NULL</code></td></tr>
-<tr><th>h</th>
-<td class="description">Hash function or <code>NULL</code> for unhashed lookups</td></tr>
-<tr><th>hsize</th>
-<td class="description">Hash size (&gt;= 0)</td></tr>
+<tr><th>a</th>
+<td class="description">Array</td></tr>
+<tr><th>e</th>
+<td class="description">Element</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Array</p>
+<p class="description">0 on failure, 1 on success</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The comparison function (&quot;f&quot;) is used to create a sorted array. The function
-receives pointers to two elements and the user data pointer (&quot;d&quot;) - the user
-data pointer argument can safely be omitted when not required so functions
-like <code>strcmp</code> can be used for sorted string arrays.<br>
-<br>
-The hash function (&quot;h&quot;) is used to implement cached lookups with the
-specified hash size (&quot;hsize&quot;).
+<p class="discussion">When inserting an element in a sorted array, non-unique elements are
+inserted at the beginning of the run of identical elements.  For unsorted
+arrays, the element is inserted at the beginning of the array.
 
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span><a id="cupsArrayNew3">cupsArrayNew3</a></h3>
-<p class="description">Create a new array with hash and/or free function.</p>
+<p class="description">Create a new array with optional compare, hash, copy, and/or free callbacks.</p>
 <p class="code">
-<a href="#cups_array_t">cups_array_t</a> *cupsArrayNew3(<a href="#cups_array_func_t">cups_array_func_t</a> f, void *d, <a href="#cups_ahash_func_t">cups_ahash_func_t</a> h, int hsize, <a href="#cups_acopy_func_t">cups_acopy_func_t</a> cf, <a href="#cups_afree_func_t">cups_afree_func_t</a> ff);</p>
+<a href="#cups_array_t">cups_array_t</a> *cupsArrayNew3(<a href="#cups_array_cb_t">cups_array_cb_t</a> f, void *d, <a href="#cups_ahash_cb_t">cups_ahash_cb_t</a> h, int hsize, <a href="#cups_acopy_cb_t">cups_acopy_cb_t</a> cf, <a href="#cups_afree_cb_t">cups_afree_cb_t</a> ff);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>f</th>
-<td class="description">Comparison function or <code>NULL</code> for an unsorted array</td></tr>
+<td class="description">Comparison callback or <code>NULL</code> for an unsorted array</td></tr>
 <tr><th>d</th>
 <td class="description">User data or <code>NULL</code></td></tr>
 <tr><th>h</th>
-<td class="description">Hash function or <code>NULL</code> for unhashed lookups</td></tr>
+<td class="description">Hash callback or <code>NULL</code> for unhashed lookups</td></tr>
 <tr><th>hsize</th>
 <td class="description">Hash size (&gt;= 0)</td></tr>
 <tr><th>cf</th>
-<td class="description">Copy function</td></tr>
+<td class="description">Copy callback</td></tr>
 <tr><th>ff</th>
-<td class="description">Free function</td></tr>
+<td class="description">Free callback</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Array</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The comparison function (&quot;f&quot;) is used to create a sorted array. The function
-receives pointers to two elements and the user data pointer (&quot;d&quot;) - the user
-data pointer argument can safely be omitted when not required so functions
-like <code>strcmp</code> can be used for sorted string arrays.<br>
+<p class="discussion">This function creates a new array with optional compare, hash, copy, and free
+callbacks.  The comparison callback (&quot;f&quot;) is used to create a sorted array.
+The callback receives pointers to two elements and the user data pointer
+(&quot;d&quot;).<br>
 <br>
-The hash function (&quot;h&quot;) is used to implement cached lookups with the
+The hash callback (&quot;h&quot;) is used to implement cached lookups with the
 specified hash size (&quot;hsize&quot;).<br>
 <br>
-The copy function (&quot;cf&quot;) is used to automatically copy/retain elements when
-added or the array is copied.<br>
-<br>
-The free function (&quot;cf&quot;) is used to automatically free/release elements when
-removed or the array is deleted.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayNext">cupsArrayNext</a></h3>
-<p class="description">Get the next element in the array.</p>
-<p class="code">
-void *cupsArrayNext(<a href="#cups_array_t">cups_array_t</a> *a);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>a</th>
-<td class="description">Array</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Next element or <code>NULL</code></p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is equivalent to &quot;cupsArrayIndex(a, cupsArrayGetIndex(a) + 1)&quot;.<br>
+The copy callback (&quot;cf&quot;) is used to automatically copy/retain elements when
+added or the array is duplicated with <a href="#cupsArrayDup"><code>cupsArrayDup</code></a>.<br>
 <br>
-The next element is undefined until you call <a href="#cupsArrayFind"><code>cupsArrayFind</code></a>,
-<a href="#cupsArrayFirst"><code>cupsArrayFirst</code></a>, or <a href="#cupsArrayIndex"><code>cupsArrayIndex</code></a>, or <a href="#cupsArrayLast"><code>cupsArrayLast</code></a>
-to set the current element.
+The free callback (&quot;cf&quot;) is used to automatically free/release elements when
+removed with <a href="#cupsArrayRemove"><code>cupsArrayRemove</code></a> or the array is deleted with
+<a href="#cupsArrayDelete"><code>cupsArrayDelete</code></a>.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayPrev">cupsArrayPrev</a></h3>
-<p class="description">Get the previous element in the array.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsArrayNewStrings">cupsArrayNewStrings</a></h3>
+<p class="description">Create a new array of delimited strings.</p>
 <p class="code">
-void *cupsArrayPrev(<a href="#cups_array_t">cups_array_t</a> *a);</p>
+<a href="#cups_array_t">cups_array_t</a> *cupsArrayNewStrings(const char *s, char delim);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>a</th>
-<td class="description">Array</td></tr>
+<tr><th>s</th>
+<td class="description">Delimited strings or <code>NULL</code></td></tr>
+<tr><th>delim</th>
+<td class="description">Delimiter character</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Previous element or <code>NULL</code></p>
+<p class="description">Array</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is equivalent to &quot;cupsArrayIndex(a, cupsArrayGetIndex(a) - 1)&quot;.<br>
-<br>
-The previous element is undefined until you call <a href="#cupsArrayFind"><code>cupsArrayFind</code></a>,
-<a href="#cupsArrayFirst"><code>cupsArrayFirst</code></a>, or <a href="#cupsArrayIndex"><code>cupsArrayIndex</code></a>, or <a href="#cupsArrayLast"><code>cupsArrayLast</code></a>
-to set the current element.
+<p class="discussion">This function creates a new array of strings that are delimited by the
+specified character.  The array automatically manages copies of the strings
+passed.  If the string pointer &quot;s&quot; is <code>NULL</code> or the empty string, no strings
+are added to the newly created array.
 
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayRemove">cupsArrayRemove</a></h3>
@@ -1841,17 +2128,6 @@ to set the current element.<br>
 The save/restore stack is guaranteed to be at least 32 elements deep.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsArrayUserData">cupsArrayUserData</a></h3>
-<p class="description">Return the user data for an array.</p>
-<p class="code">
-void *cupsArrayUserData(<a href="#cups_array_t">cups_array_t</a> *a);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>a</th>
-<td class="description">Array</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">User data</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsCancelDestJob">cupsCancelDestJob</a></h3>
 <p class="description">Cancel a job on a destination.</p>
 <p class="code">
@@ -1875,9 +2151,26 @@ Returns <code>IPP_STATUS_OK</code> on success and
 <code>IPP_STATUS_ERROR_FORBIDDEN</code> on failure.
 
 </p>
+<h3 class="function"><a id="cupsCharsetToUTF8">cupsCharsetToUTF8</a></h3>
+<p class="description">Convert legacy character set to UTF-8.</p>
+<p class="code">
+int cupsCharsetToUTF8(<a href="#cups_utf8_t">cups_utf8_t</a> *dest, const char *src, const int maxout, const <a href="#cups_encoding_t">cups_encoding_t</a> encoding);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dest</th>
+<td class="description">Target string</td></tr>
+<tr><th>src</th>
+<td class="description">Source string</td></tr>
+<tr><th>maxout</th>
+<td class="description">Max output</td></tr>
+<tr><th>encoding</th>
+<td class="description">Encoding</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Count or -1 on error</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsCheckDestSupported">cupsCheckDestSupported</a></h3>
 <p class="description">Check that the option and value are supported
-by the destination.</p>
+                             by the destination.</p>
 <p class="code">
 int cupsCheckDestSupported(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option, const char *value);</p>
 <h4 class="parameters">Parameters</h4>
@@ -1922,6 +2215,61 @@ ipp_status_t cupsCloseDestJob(<a href="#http_t">http_t</a> *http, <a href="#cups
 on success.
 
 </p>
+<h3 class="function"><a id="cupsConcatString">cupsConcatString</a></h3>
+<p class="description">Safely concatenate two strings.</p>
+<p class="code">
+size_t cupsConcatString(char *dst, const char *src, size_t dstsize);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dst</th>
+<td class="description">Destination string</td></tr>
+<tr><th>src</th>
+<td class="description">Source string</td></tr>
+<tr><th>dstsize</th>
+<td class="description">Size of destination string buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Length of string</p>
+<h3 class="function"><a id="cupsCondBroadcast">cupsCondBroadcast</a></h3>
+<p class="description">Wake up waiting threads.</p>
+<p class="code">
+void cupsCondBroadcast(<a href="#cups_cond_t">cups_cond_t</a> *cond);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>cond</th>
+<td class="description">Condition</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsCondDestroy">cupsCondDestroy</a></h3>
+<p class="description">Destroy a condition variable.</p>
+<p class="code">
+void cupsCondDestroy(<a href="#cups_cond_t">cups_cond_t</a> *cond);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>cond</th>
+<td class="description">Condition</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsCondInit">cupsCondInit</a></h3>
+<p class="description">Initialize a condition variable.</p>
+<p class="code">
+void cupsCondInit(<a href="#cups_cond_t">cups_cond_t</a> *cond);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>cond</th>
+<td class="description">Condition</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsCondWait">cupsCondWait</a></h3>
+<p class="description">Wait for a condition with optional timeout.</p>
+<p class="code">
+void cupsCondWait(<a href="#cups_cond_t">cups_cond_t</a> *cond, <a href="#cups_mutex_t">cups_mutex_t</a> *mutex, double timeout);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>cond</th>
+<td class="description">Condition</td></tr>
+<tr><th>mutex</th>
+<td class="description">Mutex</td></tr>
+<tr><th>timeout</th>
+<td class="description">Timeout in seconds (<code>0</code> or negative for none)</td></tr>
+</tbody></table>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsConnectDest">cupsConnectDest</a></h3>
 <p class="description">Open a connection to the destination.</p>
 <p class="code">
@@ -1961,35 +2309,74 @@ the destination.  Otherwise, the connection is made to the CUPS scheduler
 associated with the destination.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsCopyDest">cupsCopyDest</a></h3>
-<p class="description">Copy a destination.</p>
+<h3 class="function"><a id="cupsCopyCredentials">cupsCopyCredentials</a></h3>
+<p class="description"></p>
 <p class="code">
-int cupsCopyDest(<a href="#cups_dest_t">cups_dest_t</a> *dest, int num_dests, <a href="#cups_dest_t">cups_dest_t</a> **dests);</p>
+char *cupsCopyCredentials(const char *path, const char *common_name);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>dest</th>
-<td class="description">Destination to copy</td></tr>
-<tr><th>num_dests</th>
-<td class="description">Number of destinations</td></tr>
-<tr><th>dests</th>
-<td class="description">Destination array</td></tr>
+<tr><th>path</th>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
+<tr><th>common_name</th>
+<td class="description">Common name</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">New number of destinations</p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">Make a copy of the destination to an array of destinations (or just a single
-copy) - for use with the cupsEnumDests* functions. The caller is responsible
-for calling cupsFreeDests() on the returned object(s).
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsCopyDestConflicts">cupsCopyDestConflicts</a></h3>
-<p class="description">Get conflicts and resolutions for a new
-option/value pair.</p>
+<p class="description">Copy the X.509 certificate chain to a string.</p>
+<h3 class="function"><a id="cupsCopyCredentialsKey">cupsCopyCredentialsKey</a></h3>
+<p class="description"></p>
 <p class="code">
-int cupsCopyDestConflicts(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, int num_options, <a href="#cups_option_t">cups_option_t</a> *options, const char *new_option, const char *new_value, int *num_conflicts, <a href="#cups_option_t">cups_option_t</a> **conflicts, int *num_resolved, <a href="#cups_option_t">cups_option_t</a> **resolved);</p>
+char *cupsCopyCredentialsKey(const char *path, const char *common_name);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
+<tr><th>path</th>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
+<tr><th>common_name</th>
+<td class="description">Common name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Copy the private key to a string.</p>
+<h3 class="function"><a id="cupsCopyCredentialsRequest">cupsCopyCredentialsRequest</a></h3>
+<p class="description"></p>
+<p class="code">
+char *cupsCopyCredentialsRequest(const char *path, const char *common_name);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>path</th>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
+<tr><th>common_name</th>
+<td class="description">Common name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Copy the X.509 certificate signing request to a string.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsCopyDest">cupsCopyDest</a></h3>
+<p class="description">Copy a destination.</p>
+<p class="code">
+int cupsCopyDest(<a href="#cups_dest_t">cups_dest_t</a> *dest, int num_dests, <a href="#cups_dest_t">cups_dest_t</a> **dests);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dest</th>
+<td class="description">Destination to copy</td></tr>
+<tr><th>num_dests</th>
+<td class="description">Number of destinations</td></tr>
+<tr><th>dests</th>
+<td class="description">Destination array</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New number of destinations</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Make a copy of the destination to an array of destinations (or just a single
+copy) - for use with the cupsEnumDests* functions. The caller is responsible
+for calling cupsFreeDests() on the returned object(s).
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsCopyDestConflicts">cupsCopyDestConflicts</a></h3>
+<p class="description">Get conflicts and resolutions for a new
+                            option/value pair.</p>
+<p class="code">
+int cupsCopyDestConflicts(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, int num_options, <a href="#cups_option_t">cups_option_t</a> *options, const char *new_option, const char *new_value, int *num_conflicts, <a href="#cups_option_t">cups_option_t</a> **conflicts, int *num_resolved, <a href="#cups_option_t">cups_option_t</a> **resolved);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
 <td class="description">Connection to destination</td></tr>
 <tr><th>dest</th>
 <td class="description">Destination</td></tr>
@@ -2033,7 +2420,7 @@ to 0 and <code>NULL</code>, respectively, then the conflict cannot be resolved.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsCopyDestInfo">cupsCopyDestInfo</a></h3>
 <p class="description">Get the supported values/capabilities for the
-destination.</p>
+                       destination.</p>
 <p class="code">
 <a href="#cups_dinfo_t">cups_dinfo_t</a> *cupsCopyDestInfo(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest);</p>
 <h4 class="parameters">Parameters</h4>
@@ -2050,6 +2437,257 @@ destination.</p>
 value. <code>NULL</code> is returned on error.
 
 </p>
+<h3 class="function"><a id="cupsCopyString">cupsCopyString</a></h3>
+<p class="description">Safely copy two strings.</p>
+<p class="code">
+size_t cupsCopyString(char *dst, const char *src, size_t dstsize);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dst</th>
+<td class="description">Destination string</td></tr>
+<tr><th>src</th>
+<td class="description">Source string</td></tr>
+<tr><th>dstsize</th>
+<td class="description">Size of destination string buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Length of string</p>
+<h3 class="function"><a id="cupsCreateCredentials">cupsCreateCredentials</a></h3>
+<p class="description">Make an X.509 certificate and private key pair.</p>
+<p class="code">
+bool cupsCreateCredentials(const char *path, bool ca_cert, <a href="#cups_credpurpose_t">cups_credpurpose_t</a> purpose, <a href="#cups_credtype_t">cups_credtype_t</a> type, <a href="#cups_credusage_t">cups_credusage_t</a> usage, const char *organization, const char *org_unit, const char *locality, const char *state_province, const char *country, const char *common_name, const char *email, size_t num_alt_names, const char *const *alt_names, const char *root_name, time_t expiration_date);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>path</th>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
+<tr><th>ca_cert</th>
+<td class="description"><code>true</code> to create a CA certificate, <code>false</code> for a client/server certificate</td></tr>
+<tr><th>purpose</th>
+<td class="description">Credential purposes</td></tr>
+<tr><th>type</th>
+<td class="description">Credential type</td></tr>
+<tr><th>usage</th>
+<td class="description">Credential usages</td></tr>
+<tr><th>organization</th>
+<td class="description">Organization or <code>NULL</code> to use common name</td></tr>
+<tr><th>org_unit</th>
+<td class="description">Organizational unit or <code>NULL</code> for none</td></tr>
+<tr><th>locality</th>
+<td class="description">City/town or <code>NULL</code> for &quot;Unknown&quot;</td></tr>
+<tr><th>state_province</th>
+<td class="description">State/province or <code>NULL</code> for &quot;Unknown&quot;</td></tr>
+<tr><th>country</th>
+<td class="description">Country or <code>NULL</code> for locale-based default</td></tr>
+<tr><th>common_name</th>
+<td class="description">Common name</td></tr>
+<tr><th>email</th>
+<td class="description">Email address or <code>NULL</code> for none</td></tr>
+<tr><th>num_alt_names</th>
+<td class="description">Number of subject alternate names</td></tr>
+<tr><th>alt_names</th>
+<td class="description">Subject Alternate Names</td></tr>
+<tr><th>root_name</th>
+<td class="description">Root certificate/domain name or <code>NULL</code> for site/self-signed</td></tr>
+<tr><th>expiration_date</th>
+<td class="description">Expiration date</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates an X.509 certificate and private key pair.  The
+certificate and key are stored in the directory &quot;path&quot; or, if &quot;path&quot; is
+<code>NULL</code>, in a per-user or system-wide (when running as root) certificate/key
+store.  The generated certificate is signed by the named root certificate or,
+if &quot;root_name&quot; is <code>NULL</code>, a site-wide default root certificate.  When
+&quot;root_name&quot; is <code>NULL</code> and there is no site-wide default root certificate, a
+self-signed certificate is generated instead.<br>
+<br>
+The &quot;ca_cert&quot; argument specifies whether a CA certificate should be created.<br>
+<br>
+The &quot;purpose&quot; argument specifies the purpose(s) used for the credentials as a
+bitwise OR of the following constants:
+
+</p><ul>
+<li><code>CUPS_CREDPURPOSE_SERVER_AUTH</code> for validating TLS servers,
+</li>
+<li><code>CUPS_CREDPURPOSE_CLIENT_AUTH</code> for validating TLS clients,
+</li>
+<li><code>CUPS_CREDPURPOSE_CODE_SIGNING</code> for validating compiled code,
+</li>
+<li><code>CUPS_CREDPURPOSE_EMAIL_PROTECTION</code> for validating email messages,
+</li>
+<li><code>CUPS_CREDPURPOSE_TIME_STAMPING</code> for signing timestamps to objects, and/or
+</li>
+<li><code>CUPS_CREDPURPOSE_OCSP_SIGNING</code> for Online Certificate Status Protocol
+  message signing.</li>
+</ul>
+<p class="discussion">The &quot;type&quot; argument specifies the type of credentials using one of the
+following constants:
+
+</p><ul>
+<li><code>CUPS_CREDTYPE_DEFAULT</code>: default type (RSA-3072 or P-384),
+</li>
+<li><code>CUPS_CREDTYPE_RSA_2048_SHA256</code>: RSA with 2048-bit keys and SHA-256 hash,
+</li>
+<li><code>CUPS_CREDTYPE_RSA_3072_SHA256</code>: RSA with 3072-bit keys and SHA-256 hash,
+</li>
+<li><code>CUPS_CREDTYPE_RSA_4096_SHA256</code>: RSA with 4096-bit keys and SHA-256 hash,
+</li>
+<li><code>CUPS_CREDTYPE_ECDSA_P256_SHA256</code>: ECDSA using the P-256 curve with SHA-256 hash,
+</li>
+<li><code>CUPS_CREDTYPE_ECDSA_P384_SHA256</code>: ECDSA using the P-384 curve with SHA-256 hash, or
+</li>
+<li><code>CUPS_CREDTYPE_ECDSA_P521_SHA256</code>: ECDSA using the P-521 curve with SHA-256 hash.</li>
+</ul>
+<p class="discussion">The &quot;usage&quot; argument specifies the usage(s) for the credentials as a bitwise
+OR of the following constants:
+
+</p><ul>
+<li><code>CUPS_CREDUSAGE_DIGITAL_SIGNATURE</code>: digital signatures,
+</li>
+<li><code>CUPS_CREDUSAGE_NON_REPUDIATION</code>: non-repudiation/content commitment,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_ENCIPHERMENT</code>: key encipherment,
+</li>
+<li><code>CUPS_CREDUSAGE_DATA_ENCIPHERMENT</code>: data encipherment,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_AGREEMENT</code>: key agreement,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_CERT_SIGN</code>: key certicate signing,
+</li>
+<li><code>CUPS_CREDUSAGE_CRL_SIGN</code>: certificate revocation list signing,
+</li>
+<li><code>CUPS_CREDUSAGE_ENCIPHER_ONLY</code>: encipherment only,
+</li>
+<li><code>CUPS_CREDUSAGE_DECIPHER_ONLY</code>: decipherment only,
+</li>
+<li><code>CUPS_CREDUSAGE_DEFAULT_CA</code>: defaults for CA certificates,
+</li>
+<li><code>CUPS_CREDUSAGE_DEFAULT_TLS</code>: defaults for TLS certificates, and/or
+</li>
+<li><code>CUPS_CREDUSAGE_ALL</code>: all usages.</li>
+</ul>
+<p class="discussion">The &quot;organization&quot;, &quot;org_unit&quot;, &quot;locality&quot;, &quot;state_province&quot;, and &quot;country&quot;
+arguments specify information about the identity and geolocation of the
+issuer.<br>
+<br>
+The &quot;common_name&quot; argument specifies the common name and the &quot;num_alt_names&quot;
+and &quot;alt_names&quot; arguments specify a list of DNS hostnames for the
+certificate.<br>
+<br>
+The &quot;expiration_date&quot; argument specifies the expiration date and time as a
+Unix <code>time_t</code> value in seconds.</p>
+<h3 class="function"><a id="cupsCreateCredentialsRequest">cupsCreateCredentialsRequest</a></h3>
+<p class="description">Make an X.509 Certificate Signing Request.</p>
+<p class="code">
+bool cupsCreateCredentialsRequest(const char *path, <a href="#cups_credpurpose_t">cups_credpurpose_t</a> purpose, <a href="#cups_credtype_t">cups_credtype_t</a> type, <a href="#cups_credusage_t">cups_credusage_t</a> usage, const char *organization, const char *org_unit, const char *locality, const char *state_province, const char *country, const char *common_name, const char *email, size_t num_alt_names, const char *const *alt_names);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>path</th>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
+<tr><th>purpose</th>
+<td class="description">Credential purposes</td></tr>
+<tr><th>type</th>
+<td class="description">Credential type</td></tr>
+<tr><th>usage</th>
+<td class="description">Credential usages</td></tr>
+<tr><th>organization</th>
+<td class="description">Organization or <code>NULL</code> to use common name</td></tr>
+<tr><th>org_unit</th>
+<td class="description">Organizational unit or <code>NULL</code> for none</td></tr>
+<tr><th>locality</th>
+<td class="description">City/town or <code>NULL</code> for &quot;Unknown&quot;</td></tr>
+<tr><th>state_province</th>
+<td class="description">State/province or <code>NULL</code> for &quot;Unknown&quot;</td></tr>
+<tr><th>country</th>
+<td class="description">Country or <code>NULL</code> for locale-based default</td></tr>
+<tr><th>common_name</th>
+<td class="description">Common name</td></tr>
+<tr><th>email</th>
+<td class="description">Email address or <code>NULL</code> for none</td></tr>
+<tr><th>num_alt_names</th>
+<td class="description">Number of subject alternate names</td></tr>
+<tr><th>alt_names</th>
+<td class="description">Subject Alternate Names</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates an X.509 certificate signing request (CSR) and
+associated private key.  The CSR and key are stored in the directory &quot;path&quot;
+or, if &quot;path&quot; is <code>NULL</code>, in a per-user or system-wide (when running as root)
+certificate/key store.<br>
+<br>
+The &quot;purpose&quot; argument specifies the purpose(s) used for the credentials as a
+bitwise OR of the following constants:
+
+</p><ul>
+<li><code>CUPS_CREDPURPOSE_SERVER_AUTH</code> for validating TLS servers,
+</li>
+<li><code>CUPS_CREDPURPOSE_CLIENT_AUTH</code> for validating TLS clients,
+</li>
+<li><code>CUPS_CREDPURPOSE_CODE_SIGNING</code> for validating compiled code,
+</li>
+<li><code>CUPS_CREDPURPOSE_EMAIL_PROTECTION</code> for validating email messages,
+</li>
+<li><code>CUPS_CREDPURPOSE_TIME_STAMPING</code> for signing timestamps to objects, and/or
+</li>
+<li><code>CUPS_CREDPURPOSE_OCSP_SIGNING</code> for Online Certificate Status Protocol
+  message signing.</li>
+</ul>
+<p class="discussion">The &quot;type&quot; argument specifies the type of credentials using one of the
+following constants:
+
+</p><ul>
+<li><code>CUPS_CREDTYPE_DEFAULT</code>: default type (RSA-3072 or P-384),
+</li>
+<li><code>CUPS_CREDTYPE_RSA_2048_SHA256</code>: RSA with 2048-bit keys and SHA-256 hash,
+</li>
+<li><code>CUPS_CREDTYPE_RSA_3072_SHA256</code>: RSA with 3072-bit keys and SHA-256 hash,
+</li>
+<li><code>CUPS_CREDTYPE_RSA_4096_SHA256</code>: RSA with 4096-bit keys and SHA-256 hash,
+</li>
+<li><code>CUPS_CREDTYPE_ECDSA_P256_SHA256</code>: ECDSA using the P-256 curve with SHA-256 hash,
+</li>
+<li><code>CUPS_CREDTYPE_ECDSA_P384_SHA256</code>: ECDSA using the P-384 curve with SHA-256 hash, or
+</li>
+<li><code>CUPS_CREDTYPE_ECDSA_P521_SHA256</code>: ECDSA using the P-521 curve with SHA-256 hash.</li>
+</ul>
+<p class="discussion">The &quot;usage&quot; argument specifies the usage(s) for the credentials as a bitwise
+OR of the following constants:
+
+</p><ul>
+<li><code>CUPS_CREDUSAGE_DIGITAL_SIGNATURE</code>: digital signatures,
+</li>
+<li><code>CUPS_CREDUSAGE_NON_REPUDIATION</code>: non-repudiation/content commitment,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_ENCIPHERMENT</code>: key encipherment,
+</li>
+<li><code>CUPS_CREDUSAGE_DATA_ENCIPHERMENT</code>: data encipherment,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_AGREEMENT</code>: key agreement,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_CERT_SIGN</code>: key certicate signing,
+</li>
+<li><code>CUPS_CREDUSAGE_CRL_SIGN</code>: certificate revocation list signing,
+</li>
+<li><code>CUPS_CREDUSAGE_ENCIPHER_ONLY</code>: encipherment only,
+</li>
+<li><code>CUPS_CREDUSAGE_DECIPHER_ONLY</code>: decipherment only,
+</li>
+<li><code>CUPS_CREDUSAGE_DEFAULT_CA</code>: defaults for CA certificates,
+</li>
+<li><code>CUPS_CREDUSAGE_DEFAULT_TLS</code>: defaults for TLS certificates, and/or
+</li>
+<li><code>CUPS_CREDUSAGE_ALL</code>: all usages.</li>
+</ul>
+<p class="discussion">The &quot;organization&quot;, &quot;org_unit&quot;, &quot;locality&quot;, &quot;state_province&quot;, and &quot;country&quot;
+arguments specify information about the identity and geolocation of the
+issuer.<br>
+<br>
+The &quot;common_name&quot; argument specifies the common name and the &quot;num_alt_names&quot;
+and &quot;alt_names&quot; arguments specify a list of DNS hostnames for the
+certificate.</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsCreateDestJob">cupsCreateDestJob</a></h3>
 <p class="description">Create a job on a destination.</p>
 <p class="code">
@@ -2078,1049 +2716,2705 @@ ipp_status_t cupsCreateDestJob(<a href="#http_t">http_t</a> *http, <a href="#cup
 in the variable pointed to by &quot;job_id&quot;.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsDirClose">cupsDirClose</a></h3>
-<p class="description">Close a directory.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsCreateTempFd">cupsCreateTempFd</a></h3>
+<p class="description">Creates a temporary file descriptor.</p>
 <p class="code">
-void cupsDirClose(<a href="#cups_dir_t">cups_dir_t</a> *dp);</p>
+int cupsCreateTempFd(const char *prefix, const char *suffix, char *filename, size_t len);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>dp</th>
-<td class="description">Directory pointer</td></tr>
+<tr><th>prefix</th>
+<td class="description">Filename prefix or <code>NULL</code> for none</td></tr>
+<tr><th>suffix</th>
+<td class="description">Filename suffix or <code>NULL</code> for none</td></tr>
+<tr><th>filename</th>
+<td class="description">Pointer to buffer</td></tr>
+<tr><th>len</th>
+<td class="description">Size of buffer</td></tr>
 </tbody></table>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsDirOpen">cupsDirOpen</a></h3>
-<p class="description">Open a directory.</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New file descriptor or <code>-1</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates a temporary file and associated descriptor.  The unique
+temporary filename uses the &quot;prefix&quot; and &quot;suffix&quot; arguments and is returned
+in the &quot;filename&quot; buffer.  The temporary file is opened for reading and
+writing.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsCreateTempFile">cupsCreateTempFile</a></h3>
+<p class="description">Creates a temporary CUPS file.</p>
 <p class="code">
-<a href="#cups_dir_t">cups_dir_t</a> *cupsDirOpen(const char *directory);</p>
+<a href="#cups_file_t">cups_file_t</a> *cupsCreateTempFile(const char *prefix, const char *suffix, char *filename, size_t len);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>directory</th>
-<td class="description">Directory name</td></tr>
+<tr><th>prefix</th>
+<td class="description">Filename prefix or <code>NULL</code> for none</td></tr>
+<tr><th>suffix</th>
+<td class="description">Filename suffix or <code>NULL</code> for none</td></tr>
+<tr><th>filename</th>
+<td class="description">Pointer to buffer</td></tr>
+<tr><th>len</th>
+<td class="description">Size of buffer</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Directory pointer or <code>NULL</code> if the directory could not be opened.</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsDirRead">cupsDirRead</a></h3>
-<p class="description">Read the next directory entry.</p>
+<p class="description">CUPS file or <code>NULL</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates a temporary file and returns a CUPS file for it.  The
+unique temporary filename uses the &quot;prefix&quot; and &quot;suffix&quot; arguments and is
+returned in the &quot;filename&quot; buffer.  The temporary file is opened for writing.
+
+</p>
+<h3 class="function"><a id="cupsDNSSDAssembleFullName">cupsDNSSDAssembleFullName</a></h3>
+<p class="description">Create a full service name from the instance
+                                name, registration type, and domain.</p>
 <p class="code">
-<a href="#cups_dentry_t">cups_dentry_t</a> *cupsDirRead(<a href="#cups_dir_t">cups_dir_t</a> *dp);</p>
+bool cupsDNSSDAssembleFullName(char *fullname, size_t fullsize, const char *name, const char *type, const char *domain);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>dp</th>
-<td class="description">Directory pointer</td></tr>
+<tr><th>fullname</th>
+<td class="description">Buffer for full name</td></tr>
+<tr><th>fullsize</th>
+<td class="description">Size of buffer</td></tr>
+<tr><th>name</th>
+<td class="description">Service instance name</td></tr>
+<tr><th>type</th>
+<td class="description">Registration type</td></tr>
+<tr><th>domain</th>
+<td class="description">Domain</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Directory entry or <code>NULL</code> when there are no more</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsDirRewind">cupsDirRewind</a></h3>
-<p class="description">Rewind to the start of the directory.</p>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function combines an instance name (&quot;Example Name&quot;), registration type
+(&quot;_ipp._tcp&quot;), and domain (&quot;local.&quot;) to create a properly escaped full
+service name (&quot;Example032Name._ipp._tcp.local.&quot;).</p>
+<h3 class="function"><a id="cupsDNSSDBrowseDelete">cupsDNSSDBrowseDelete</a></h3>
+<p class="description">Cancel and delete a browse request.</p>
 <p class="code">
-void cupsDirRewind(<a href="#cups_dir_t">cups_dir_t</a> *dp);</p>
+void cupsDNSSDBrowseDelete(<a href="#cups_dnssd_browse_t">cups_dnssd_browse_t</a> *browse);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>dp</th>
-<td class="description">Directory pointer</td></tr>
+<tr><th>browse</th>
+<td class="description">Browse request</td></tr>
 </tbody></table>
-<h3 class="function"><span class="info">&#160;CUPS 1.1.20/macOS 10.4&#160;</span><a id="cupsDoAuthentication">cupsDoAuthentication</a></h3>
-<p class="description">Authenticate a request.</p>
+<h3 class="function"><a id="cupsDNSSDBrowseGetContext">cupsDNSSDBrowseGetContext</a></h3>
+<p class="description">Get the DNS-SD context for the browse request.</p>
 <p class="code">
-int cupsDoAuthentication(<a href="#http_t">http_t</a> *http, const char *method, const char *resource);</p>
+<a href="#cups_dnssd_t">cups_dnssd_t</a> *cupsDNSSDBrowseGetContext(<a href="#cups_dnssd_browse_t">cups_dnssd_browse_t</a> *browse);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
-<tr><th>method</th>
-<td class="description">Request method (&quot;GET&quot;, &quot;POST&quot;, &quot;PUT&quot;)</td></tr>
-<tr><th>resource</th>
-<td class="description">Resource path</td></tr>
+<tr><th>browse</th>
+<td class="description">Browse request</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on success, -1 on error</p>
+<p class="description">Context or <code>NULL</code></p>
+<h3 class="function"><a id="cupsDNSSDBrowseNew">cupsDNSSDBrowseNew</a></h3>
+<p class="description">Create a new DNS-SD browse request.</p>
+<p class="code">
+<a href="#cups_dnssd_browse_t">cups_dnssd_browse_t</a> *cupsDNSSDBrowseNew(<a href="#cups_dnssd_t">cups_dnssd_t</a> *dnssd, uint32_t if_index, const char *types, const char *domain, <a href="#cups_dnssd_browse_cb_t">cups_dnssd_browse_cb_t</a> browse_cb, void *cb_data);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dnssd</th>
+<td class="description">DNS-SD context</td></tr>
+<tr><th>if_index</th>
+<td class="description">Interface index, <code>CUPS_DNSSD_IF_ANY</code>, or <code>CUPS_DNSSD_IF_LOCAL</code></td></tr>
+<tr><th>types</th>
+<td class="description">Service types</td></tr>
+<tr><th>domain</th>
+<td class="description">Domain name or <code>NULL</code> for default</td></tr>
+<tr><th>browse_cb</th>
+<td class="description">Browse callback function</td></tr>
+<tr><th>cb_data</th>
+<td class="description">Browse callback data</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Browse request or <code>NULL</code> on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function should be called in response to a <code>HTTP_STATUS_UNAUTHORIZED</code>
-status, prior to resubmitting your request.
-
+<p class="discussion">This function creates a new DNS-SD browse request for the specified service
+types and optional domain and interface index.  The &quot;types&quot; argument can be a
+single service type (&quot;_ipp._tcp&quot;) or a service type and comma-delimited list
+of sub-types (&quot;_ipp._tcp,_print,_universal&quot;).<br>
+<br>
+Newly discovered services are reported using the required browse callback
+function, with the &quot;flags&quot; argument set to <code>CUPS_DNSSD_FLAGS_ADD</code> for newly
+discovered services, <code>CUPS_DNSSD_FLAGS_NONE</code> for removed services, or
+<code>CUPS_DNSSD_FLAGS_ERROR</code> on an error:
+
+<pre>
+void
+browse_cb(
+    cups_dnssd_browse_t *browse,
+    void                *cb_data,
+    cups_dnssd_flags_t  flags,
+    uint32_t            if_index,
+    const char          *name,
+    const char          *regtype,
+    const char          *domain)
+{
+    // Process added/removed service
+}
+</pre>
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 2.3/macOS 10.14&#160;</span><a id="cupsEncodeOption">cupsEncodeOption</a></h3>
-<p class="description">Encode a single option into an IPP attribute.</p>
+<h3 class="function"><a id="cupsDNSSDCopyHostName">cupsDNSSDCopyHostName</a></h3>
+<p class="description">Copy the current mDNS hostname for the system.</p>
 <p class="code">
-<a href="#ipp_attribute_t">ipp_attribute_t</a> *cupsEncodeOption(<a href="#ipp_t">ipp_t</a> *ipp, ipp_tag_t group_tag, const char *name, const char *value);</p>
+char *cupsDNSSDCopyHostName(<a href="#cups_dnssd_t">cups_dnssd_t</a> *dnssd, char *buffer, size_t bufsize);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>ipp</th>
-<td class="description">IPP request/response</td></tr>
-<tr><th>group_tag</th>
-<td class="description">Attribute group</td></tr>
-<tr><th>name</th>
-<td class="description">Option name</td></tr>
-<tr><th>value</th>
-<td class="description">Option string value</td></tr>
+<tr><th>dnssd</th>
+<td class="description">DNS-SD context</td></tr>
+<tr><th>buffer</th>
+<td class="description">Hostname buffer</td></tr>
+<tr><th>bufsize</th>
+<td class="description">Size of hostname buffer (at least 70 bytes)</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">New attribute or <code>NULL</code> on error</p>
-<h3 class="function"><a id="cupsEncodeOptions">cupsEncodeOptions</a></h3>
-<p class="description">Encode printer options into IPP attributes.</p>
+<p class="description">mDNS hostname or <code>NULL</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function copies the current mDNS hostname (&quot;hostname.local&quot;) to the
+provided buffer.  The &quot;dnssd&quot; parameter is a DNS-SD context created with
+<a href="#cupsDNSSDNew"><code>cupsDNSSDNew</code></a>.  The &quot;buffer&quot; parameter points to a character array of
+at least 70 bytes and the &quot;bufsize&quot; parameter specifies the actual size of
+the array.</p>
+<h3 class="function"><a id="cupsDNSSDDecodeTXT">cupsDNSSDDecodeTXT</a></h3>
+<p class="description">Decode a TXT record into key/value pairs.</p>
 <p class="code">
-void cupsEncodeOptions(<a href="#ipp_t">ipp_t</a> *ipp, int num_options, <a href="#cups_option_t">cups_option_t</a> *options);</p>
+int cupsDNSSDDecodeTXT(const unsigned char *txtrec, uint16_t txtlen, <a href="#cups_option_t">cups_option_t</a> **txt);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>ipp</th>
-<td class="description">IPP request/response</td></tr>
-<tr><th>num_options</th>
-<td class="description">Number of options</td></tr>
-<tr><th>options</th>
-<td class="description">Options</td></tr>
+<tr><th>txtrec</th>
+<td class="description">TXT record data</td></tr>
+<tr><th>txtlen</th>
+<td class="description">TXT record length</td></tr>
+<tr><th>txt</th>
+<td class="description">Key/value pairs</td></tr>
 </tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of key/value pairs</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function adds operation, job, and then subscription attributes,
-in that order. Use the <a href="#cupsEncodeOptions2"><code>cupsEncodeOptions2</code></a> function to add attributes
-for a single group.</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsEncodeOptions2">cupsEncodeOptions2</a></h3>
-<p class="description">Encode printer options into IPP attributes for a group.</p>
+<p class="discussion">This function converts the DNS TXT record encoding of key/value pairs into
+<code>cups_option_t</code> elements that can be accessed using the <a href="#cupsGetOption"><code>cupsGetOption</code></a>
+function and freed using the <a href="#cupsFreeOptions"><code>cupsFreeOptions</code></a> function.</p>
+<h3 class="function"><a id="cupsDNSSDDelete">cupsDNSSDDelete</a></h3>
+<p class="description">Delete a DNS-SD context and all its requests.</p>
 <p class="code">
-void cupsEncodeOptions2(<a href="#ipp_t">ipp_t</a> *ipp, int num_options, <a href="#cups_option_t">cups_option_t</a> *options, ipp_tag_t group_tag);</p>
+void cupsDNSSDDelete(<a href="#cups_dnssd_t">cups_dnssd_t</a> *dnssd);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>ipp</th>
-<td class="description">IPP request/response</td></tr>
-<tr><th>num_options</th>
-<td class="description">Number of options</td></tr>
-<tr><th>options</th>
-<td class="description">Options</td></tr>
-<tr><th>group_tag</th>
-<td class="description">Group to encode</td></tr>
+<tr><th>dnssd</th>
+<td class="description">DNS-SD context</td></tr>
 </tbody></table>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">This function only adds attributes for a single group. Call this
-function multiple times for each group, or use <a href="#cupsEncodeOptions"><code>cupsEncodeOptions</code></a>
-to add the standard groups.
-
-</p>
-<h3 class="function"><a id="cupsEncryption">cupsEncryption</a></h3>
-<p class="description">Get the current encryption settings.</p>
+<h3 class="function"><a id="cupsDNSSDGetConfigChanges">cupsDNSSDGetConfigChanges</a></h3>
+<p class="description">Get the number of host name/network
+                                configuration changes seen.</p>
 <p class="code">
-<a href="#http_encryption_t">http_encryption_t</a> cupsEncryption(void);</p>
+size_t cupsDNSSDGetConfigChanges(<a href="#cups_dnssd_t">cups_dnssd_t</a> *dnssd);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dnssd</th>
+<td class="description">DNS-SD context</td></tr>
+</tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Encryption settings</p>
+<p class="description">Number of host name changes</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_ENCRYPTION_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">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsEnumDests">cupsEnumDests</a></h3>
-<p class="description">Enumerate available destinations with a callback function.</p>
+<p class="discussion">This function returns the number of host name or network configuration
+changes that have been seen since the context was created.  The value can be
+used to track when local services need to be updated.  Registered services
+will also get a callback with the <code>CUPS_DNSSD_FLAGS_HOST_CHANGE</code> bit set in
+the &quot;flags&quot; argument for host name changes and/or
+<code>CUPS_DNSSD_FLAGS_NETWORK_CHANGE</code> for network changes.</p>
+<h3 class="function"><a id="cupsDNSSDNew">cupsDNSSDNew</a></h3>
+<p class="description">Create a new DNS-SD context.</p>
 <p class="code">
-int cupsEnumDests(unsigned flags, int msec, int *cancel, <a href="#cups_ptype_t">cups_ptype_t</a> type, <a href="#cups_ptype_t">cups_ptype_t</a> mask, <a href="#cups_dest_cb_t">cups_dest_cb_t</a> cb, void *user_data);</p>
+<a href="#cups_dnssd_t">cups_dnssd_t</a> *cupsDNSSDNew(<a href="#cups_dnssd_error_cb_t">cups_dnssd_error_cb_t</a> error_cb, void *cb_data);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>flags</th>
-<td class="description">Enumeration flags</td></tr>
-<tr><th>msec</th>
-<td class="description">Timeout in milliseconds, -1 for indefinite</td></tr>
-<tr><th>cancel</th>
-<td class="description">Pointer to &quot;cancel&quot; variable</td></tr>
-<tr><th>type</th>
-<td class="description">Printer type bits</td></tr>
-<tr><th>mask</th>
-<td class="description">Mask for printer type bits</td></tr>
-<tr><th>cb</th>
-<td class="description">Callback function</td></tr>
-<tr><th>user_data</th>
-<td class="description">User data</td></tr>
+<tr><th>error_cb</th>
+<td class="description">Error callback function</td></tr>
+<tr><th>cb_data</th>
+<td class="description">Error callback data</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">1 on success, 0 on failure</p>
+<p class="description">DNS-SD context</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Destinations are enumerated from one or more sources.  The callback function
-receives the <code>user_data</code> pointer and the destination pointer which can
-be used as input to the <a href="#cupsCopyDest"><code>cupsCopyDest</code></a> function.  The function must
-return 1 to continue enumeration or 0 to stop.<br>
-<br>
-The <code>type</code> and <code>mask</code> arguments allow the caller to filter the
-destinations that are enumerated.  Passing 0 for both will enumerate all
-printers.  The constant <code>CUPS_PRINTER_DISCOVERED</code> is used to filter on
-destinations that are available but have not yet been added locally.<br>
-<br>
-Enumeration happens on the current thread and does not return until all
-destinations have been enumerated or the callback function returns 0.<br>
-<br>
-Note: The callback function will likely receive multiple updates for the same
-destinations - it is up to the caller to suppress any duplicate destinations.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileClose">cupsFileClose</a></h3>
-<p class="description">Close a CUPS file.</p>
-<p class="code">
-int cupsFileClose(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on success, -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileCompression">cupsFileCompression</a></h3>
-<p class="description">Return whether a file is compressed.</p>
+<p class="discussion">This function creates a new DNS-SD context for browsing, querying, resolving,
+and/or registering services.  Call <a href="#cupsDNSSDDelete"><code>cupsDNSSDDelete</code></a> to stop any pending
+browses, queries, or resolves, unregister any services, and free the DNS-SD
+context.</p>
+<h3 class="function"><a id="cupsDNSSDQueryDelete">cupsDNSSDQueryDelete</a></h3>
+<p class="description">Cancel and delete a query request.</p>
 <p class="code">
-int cupsFileCompression(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+void cupsDNSSDQueryDelete(<a href="#cups_dnssd_query_t">cups_dnssd_query_t</a> *query);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>query</th>
+<td class="description">Query request</td></tr>
 </tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description"><code>CUPS_FILE_NONE</code> or <code>CUPS_FILE_GZIP</code></p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileEOF">cupsFileEOF</a></h3>
-<p class="description">Return the end-of-file status.</p>
+<h3 class="function"><a id="cupsDNSSDQueryGetContext">cupsDNSSDQueryGetContext</a></h3>
+<p class="description">Get the DNS-SD context for the query request.</p>
 <p class="code">
-int cupsFileEOF(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<a href="#cups_dnssd_t">cups_dnssd_t</a> *cupsDNSSDQueryGetContext(<a href="#cups_dnssd_query_t">cups_dnssd_query_t</a> *query);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>query</th>
+<td class="description">Query request</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">1 on end of file, 0 otherwise</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileFind">cupsFileFind</a></h3>
-<p class="description">Find a file using the specified path.</p>
+<p class="description">DNS-SD context or <code>NULL</code></p>
+<h3 class="function"><a id="cupsDNSSDQueryNew">cupsDNSSDQueryNew</a></h3>
+<p class="description">Create a new query request.</p>
 <p class="code">
-const char *cupsFileFind(const char *filename, const char *path, int executable, char *buffer, int bufsize);</p>
+<a href="#cups_dnssd_query_t">cups_dnssd_query_t</a> *cupsDNSSDQueryNew(<a href="#cups_dnssd_t">cups_dnssd_t</a> *dnssd, uint32_t if_index, const char *fullname, uint16_t rrtype, <a href="#cups_dnssd_query_cb_t">cups_dnssd_query_cb_t</a> query_cb, void *cb_data);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>filename</th>
-<td class="description">File to find</td></tr>
-<tr><th>path</th>
-<td class="description">Colon/semicolon-separated path</td></tr>
-<tr><th>executable</th>
-<td class="description">1 = executable files, 0 = any file/dir</td></tr>
-<tr><th>buffer</th>
-<td class="description">Filename buffer</td></tr>
-<tr><th>bufsize</th>
-<td class="description">Size of filename buffer</td></tr>
+<tr><th>dnssd</th>
+<td class="description">DNS-SD context</td></tr>
+<tr><th>if_index</th>
+<td class="description">Interface index or <code>CUPS_DNSSD_IF_ANY</code> or <code>CUPS_DNSSD_IF_LOCAL</code></td></tr>
+<tr><th>fullname</th>
+<td class="description">Full DNS name including types and domain</td></tr>
+<tr><th>rrtype</th>
+<td class="description">Record type to query (<code>CUPS_DNSSD_RRTYPE_TXT</code>, etc.)</td></tr>
+<tr><th>query_cb</th>
+<td class="description">Query callback function</td></tr>
+<tr><th>cb_data</th>
+<td class="description">Query callback data</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Full path to file or <code>NULL</code> if not found</p>
+<p class="description">Query request or <code>NULL</code> on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function allows the paths in the path string to be separated by
-colons (UNIX standard) or semicolons (Windows standard) and stores the
-result in the buffer supplied.  If the file cannot be found in any of
-the supplied paths, <code>NULL</code> is returned. A <code>NULL</code> path only
-matches the current directory.
+<p class="discussion">This function creates a new DNS-SD query request for the specified full
+service name and DNS record type.  The &quot;fullname&quot; parameter specifies the
+full DNS name of the service (instance name, type, and domain) being queried.
+Responses to the query are reported using the required query callback
+function with the &quot;flags&quot; argument set to <code>CUPS_DNSSD_FLAGS_NONE</code> on success
+or <code>CUPS_DNSSD_FLAGS_ERROR</code> on error:
 
+<pre>
+void
+query_cb(
+    cups_dnssd_query_t *query,
+    void               *cb_data,
+    cups_dnssd_flags_t flags,
+    uint32_t           if_index,
+    const char         *fullname,
+    uint16_t           rrtype,
+    const void         *qdata,
+    uint16_t           qlen)
+{
+    // Process query record
+}
+</pre>
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileFlush">cupsFileFlush</a></h3>
-<p class="description">Flush pending output.</p>
+<h3 class="function"><a id="cupsDNSSDResolveDelete">cupsDNSSDResolveDelete</a></h3>
+<p class="description">Cancel and free a resolve request.</p>
 <p class="code">
-int cupsFileFlush(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+void cupsDNSSDResolveDelete(<a href="#cups_dnssd_resolve_t">cups_dnssd_resolve_t</a> *res);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>res</th>
+<td class="description">Resolve request</td></tr>
 </tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on success, -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileGetChar">cupsFileGetChar</a></h3>
-<p class="description">Get a single character from a file.</p>
+<h3 class="function"><a id="cupsDNSSDResolveGetContext">cupsDNSSDResolveGetContext</a></h3>
+<p class="description">Get the DNS-SD context for the resolve request.</p>
 <p class="code">
-int cupsFileGetChar(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<a href="#cups_dnssd_t">cups_dnssd_t</a> *cupsDNSSDResolveGetContext(<a href="#cups_dnssd_resolve_t">cups_dnssd_resolve_t</a> *resolve);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>resolve</th>
+<td class="description">Resolve request</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Character or -1 on end of file</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileGetConf">cupsFileGetConf</a></h3>
-<p class="description">Get a line from a configuration file.</p>
+<p class="description">DNS-SD context or <code>NULL</code></p>
+<h3 class="function"><a id="cupsDNSSDResolveNew">cupsDNSSDResolveNew</a></h3>
+<p class="description">Create a new DNS-SD resolve request.</p>
 <p class="code">
-char *cupsFileGetConf(<a href="#cups_file_t">cups_file_t</a> *fp, char *buf, size_t buflen, char **value, int *linenum);</p>
+<a href="#cups_dnssd_resolve_t">cups_dnssd_resolve_t</a> *cupsDNSSDResolveNew(<a href="#cups_dnssd_t">cups_dnssd_t</a> *dnssd, uint32_t if_index, const char *name, const char *type, const char *domain, <a href="#cups_dnssd_resolve_cb_t">cups_dnssd_resolve_cb_t</a> resolve_cb, void *cb_data);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>buf</th>
-<td class="description">String buffer</td></tr>
-<tr><th>buflen</th>
-<td class="description">Size of string buffer</td></tr>
-<tr><th>value</th>
-<td class="description">Pointer to value</td></tr>
-<tr><th>linenum</th>
-<td class="description">Current line number</td></tr>
+<tr><th>dnssd</th>
+<td class="description">DNS-SD context</td></tr>
+<tr><th>if_index</th>
+<td class="description">Interface index or <code>CUPS_DNSSD_IF_ANY</code> or <code>CUPS_DNSSD_IF_LOCAL</code></td></tr>
+<tr><th>name</th>
+<td class="description">Service name</td></tr>
+<tr><th>type</th>
+<td class="description">Service type</td></tr>
+<tr><th>domain</th>
+<td class="description">Domain name or <code>NULL</code> for default</td></tr>
+<tr><th>resolve_cb</th>
+<td class="description">Resolve callback function</td></tr>
+<tr><th>cb_data</th>
+<td class="description">Resolve callback data</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Resolve request or <code>NULL</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates a new DNS-SD resolver for the specified instance name,
+service type, and optional domain and interface index.  Resikved services
+are reported using the required resolve callback function, with the &quot;flags&quot;
+argument set to <code>CUPS_DNSSD_FLAGS_NONE</code> on success or
+<code>CUPS_DNSSD_FLAGS_ERROR</code> on error:
+
+<pre>
+void
+resolve_cb(
+    cups_dnssd_resolve_t *resolve,
+    void                 *cb_data,
+    cups_dnssd_flags_t   flags,
+    uint32_t             if_index,
+    const char           *fullname,
+    const char           *host,
+    uint16_t             port,
+    int                  num_txt,
+    cups_option_t        *txt)
+{
+    // Process resolved service
+}
+</pre>
+</p>
+<h3 class="function"><a id="cupsDNSSDSeparateFullName">cupsDNSSDSeparateFullName</a></h3>
+<p class="description">Separate a full service name into an instance
+                                name, registration type, and domain.</p>
+<p class="code">
+bool cupsDNSSDSeparateFullName(const char *fullname, char *name, size_t namesize, char *type, size_t typesize, char *domain, size_t domainsize);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fullname</th>
+<td class="description">Full service name</td></tr>
+<tr><th>name</th>
+<td class="description">Instance name buffer</td></tr>
+<tr><th>namesize</th>
+<td class="description">Size of instance name buffer</td></tr>
+<tr><th>type</th>
+<td class="description">Registration type buffer</td></tr>
+<tr><th>typesize</th>
+<td class="description">Size of registration type buffer</td></tr>
+<tr><th>domain</th>
+<td class="description">Domain name buffer</td></tr>
+<tr><th>domainsize</th>
+<td class="description">Size of domain name buffer</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Line read or <code>NULL</code> on end of file or error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileGetLine">cupsFileGetLine</a></h3>
-<p class="description">Get a CR and/or LF-terminated line that may
-contain binary data.</p>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function separates a full service name such as
+&quot;Example032Name._ipp._tcp.local.&quot;) into its instance name (&quot;Example Name&quot;),
+registration type (&quot;_ipp._tcp&quot;), and domain (&quot;local.&quot;).</p>
+<h3 class="function"><a id="cupsDNSSDServiceAdd">cupsDNSSDServiceAdd</a></h3>
+<p class="description">Add a service instance.</p>
 <p class="code">
-size_t cupsFileGetLine(<a href="#cups_file_t">cups_file_t</a> *fp, char *buf, size_t buflen);</p>
+bool cupsDNSSDServiceAdd(<a href="#cups_dnssd_service_t">cups_dnssd_service_t</a> *service, const char *types, const char *domain, const char *host, uint16_t port, int num_txt, <a href="#cups_option_t">cups_option_t</a> *txt);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">File to read from</td></tr>
-<tr><th>buf</th>
-<td class="description">Buffer</td></tr>
-<tr><th>buflen</th>
-<td class="description">Size of buffer</td></tr>
+<tr><th>service</th>
+<td class="description">Service</td></tr>
+<tr><th>types</th>
+<td class="description">Service types</td></tr>
+<tr><th>domain</th>
+<td class="description">Domain name or <code>NULL</code> for default</td></tr>
+<tr><th>host</th>
+<td class="description">Host name or <code>NULL</code> for default</td></tr>
+<tr><th>port</th>
+<td class="description">Port number or <code>0</code> for none</td></tr>
+<tr><th>num_txt</th>
+<td class="description">Number of TXT record values</td></tr>
+<tr><th>txt</th>
+<td class="description">TXT record values</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of bytes on line or 0 on end of file</p>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function differs from <a href="#cupsFileGets"><code>cupsFileGets</code></a> in that the trailing CR
-and LF are preserved, as is any binary data on the line. The buffer is
-nul-terminated, however you should use the returned length to determine
-the number of bytes on the line.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileGets">cupsFileGets</a></h3>
-<p class="description">Get a CR and/or LF-terminated line.</p>
+<p class="discussion">This function adds a service instance for the specified service types,
+domain, host, and port.  The &quot;types&quot; argument can be a single service type
+(&quot;_ipp._tcp&quot;) or a service type and comma-delimited list of sub-types
+(&quot;_ipp._tcp,_print,_universal&quot;).<br>
+<br>
+Call the <a href="#cupsDNSSDServicePublish"><code>cupsDNSSDServicePublish</code></a> function after all service instances
+have been added.</p>
+<h3 class="function"><a id="cupsDNSSDServiceDelete">cupsDNSSDServiceDelete</a></h3>
+<p class="description">Cancel and free a service registration.</p>
 <p class="code">
-char *cupsFileGets(<a href="#cups_file_t">cups_file_t</a> *fp, char *buf, size_t buflen);</p>
+void cupsDNSSDServiceDelete(<a href="#cups_dnssd_service_t">cups_dnssd_service_t</a> *service);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>buf</th>
-<td class="description">String buffer</td></tr>
-<tr><th>buflen</th>
-<td class="description">Size of string buffer</td></tr>
+<tr><th>service</th>
+<td class="description">Service</td></tr>
 </tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Line read or <code>NULL</code> on end of file or error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileLock">cupsFileLock</a></h3>
-<p class="description">Temporarily lock access to a file.</p>
+<h3 class="function"><a id="cupsDNSSDServiceGetContext">cupsDNSSDServiceGetContext</a></h3>
+<p class="description">Get the DNS-SD context for the service
+                                 registration.</p>
 <p class="code">
-int cupsFileLock(<a href="#cups_file_t">cups_file_t</a> *fp, int block);</p>
+<a href="#cups_dnssd_t">cups_dnssd_t</a> *cupsDNSSDServiceGetContext(<a href="#cups_dnssd_service_t">cups_dnssd_service_t</a> *service);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>block</th>
-<td class="description">1 to wait for the lock, 0 to fail right away</td></tr>
+<tr><th>service</th>
+<td class="description">Service registration</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on success, -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileNumber">cupsFileNumber</a></h3>
-<p class="description">Return the file descriptor associated with a CUPS file.</p>
+<p class="description">DNS-SD context or <code>NULL</code></p>
+<h3 class="function"><a id="cupsDNSSDServiceGetName">cupsDNSSDServiceGetName</a></h3>
+<p class="description">Get the service instance name for the service registration.</p>
 <p class="code">
-int cupsFileNumber(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+const char *cupsDNSSDServiceGetName(<a href="#cups_dnssd_service_t">cups_dnssd_service_t</a> *service);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>service</th>
+<td class="description">Service registration</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">File descriptor</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileOpen">cupsFileOpen</a></h3>
-<p class="description">Open a CUPS file.</p>
+<p class="description">Service instance name</p>
+<h3 class="function"><a id="cupsDNSSDServiceNew">cupsDNSSDServiceNew</a></h3>
+<p class="description">Create a new named service.</p>
 <p class="code">
-<a href="#cups_file_t">cups_file_t</a> *cupsFileOpen(const char *filename, const char *mode);</p>
+<a href="#cups_dnssd_service_t">cups_dnssd_service_t</a> *cupsDNSSDServiceNew(<a href="#cups_dnssd_t">cups_dnssd_t</a> *dnssd, uint32_t if_index, const char *name, <a href="#cups_dnssd_service_cb_t">cups_dnssd_service_cb_t</a> cb, void *cb_data);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>filename</th>
-<td class="description">Name of file</td></tr>
-<tr><th>mode</th>
-<td class="description">Open mode</td></tr>
+<tr><th>dnssd</th>
+<td class="description">DNS-SD context</td></tr>
+<tr><th>if_index</th>
+<td class="description">Interface index, <code>CUPS_DNSSD_IF_ANY</code>, or <code>CUPS_DNSSD_IF_LOCAL</code></td></tr>
+<tr><th>name</th>
+<td class="description">Name of service</td></tr>
+<tr><th>cb</th>
+<td class="description">Service registration callback function</td></tr>
+<tr><th>cb_data</th>
+<td class="description">Service registration callback data</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">CUPS file or <code>NULL</code> if the file or socket cannot be opened</p>
+<p class="description">Service or <code>NULL</code> on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The &quot;mode&quot; parameter can be &quot;r&quot; to read, &quot;w&quot; to write, overwriting any
-existing file, &quot;a&quot; to append to an existing file or create a new file,
-or &quot;s&quot; to open a socket connection.<br>
-<br>
-When opening for writing (&quot;w&quot;), an optional number from 1 to 9 can be
-supplied which enables Flate compression of the file.  Compression is
-not supported for the &quot;a&quot; (append) mode.<br>
+<p class="discussion">This function creates a new DNS-SD service registration for the given service
+instance name and interface.  Specific services using the name are added
+using the <a href="#cupsDNSSDServiceAdd"><code>cupsDNSSDServiceAdd</code></a> function.<br>
 <br>
-When opening a socket connection, the filename is a string of the form
-&quot;address:port&quot; or &quot;hostname:port&quot;. The socket will make an IPv4 or IPv6
-connection as needed, generally preferring IPv6 connections when there is
-a choice.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileOpenFd">cupsFileOpenFd</a></h3>
-<p class="description">Open a CUPS file using a file descriptor.</p>
+The required service callback is called for select events, with the &quot;flags&quot;
+argument set to <code>CUPS_DNSSD_FLAGS_NONE</code> for a successful registration,
+<code>CUPS_DNSSD_FLAGS_COLLISION</code> when there is a name collision, or
+<code>CUPS_DNSSD_FLAGS_ERROR</code> when there is a problem completing the service
+registration.</p>
+<h3 class="function"><a id="cupsDNSSDServicePublish">cupsDNSSDServicePublish</a></h3>
+<p class="description">Publish a service.</p>
 <p class="code">
-<a href="#cups_file_t">cups_file_t</a> *cupsFileOpenFd(int fd, const char *mode);</p>
+bool cupsDNSSDServicePublish(<a href="#cups_dnssd_service_t">cups_dnssd_service_t</a> *service);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fd</th>
-<td class="description">File descriptor</td></tr>
-<tr><th>mode</th>
-<td class="description">Open mode</td></tr>
+<tr><th>service</th>
+<td class="description">Service</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">CUPS file or <code>NULL</code> if the file could not be opened</p>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The &quot;mode&quot; parameter can be &quot;r&quot; to read, &quot;w&quot; to write, &quot;a&quot; to append,
-or &quot;s&quot; to treat the file descriptor as a bidirectional socket connection.<br>
-<br>
-When opening for writing (&quot;w&quot;), an optional number from 1 to 9 can be
-supplied which enables Flate compression of the file.  Compression is
-not supported for the &quot;a&quot; (append) mode.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFilePeekChar">cupsFilePeekChar</a></h3>
-<p class="description">Peek at the next character from a file.</p>
+<p class="discussion">This function publishes the DNS-SD services added using the
+<a href="#cupsDNSSDServiceAdd"><code>cupsDNSSDServiceAdd</code></a> function.</p>
+<h3 class="function"><a id="cupsDNSSDServiceSetLocation">cupsDNSSDServiceSetLocation</a></h3>
+<p class="description">Set the geolocation (LOC record) of a
+                                  service.</p>
 <p class="code">
-int cupsFilePeekChar(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+bool cupsDNSSDServiceSetLocation(<a href="#cups_dnssd_service_t">cups_dnssd_service_t</a> *service, const char *geo_uri);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>service</th>
+<td class="description">Service</td></tr>
+<tr><th>geo_uri</th>
+<td class="description">Geolocation as a 'geo:' URI</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Character or -1 on end of file</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFilePrintf">cupsFilePrintf</a></h3>
-<p class="description">Write a formatted string.</p>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sets the geolocation of a service using a 'geo:' URI (RFC 5870)
+of the form
+'geo:LATITUDE,LONGITUDE[,ALTITUDE][;crs=CRSLABEL][;u=UNCERTAINTY]'.  The
+specified coordinates and uncertainty are converted into a DNS LOC record
+for the service name label.  Only the &quot;wgs84&quot; CRSLABEL string is supported.<br>
+<br>
+You must call this function prior to <a href="#cupsDNSSDServiceAdd"><code>cupsDNSSDServiceAdd</code></a>.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsDirClose">cupsDirClose</a></h3>
+<p class="description">Close a directory.</p>
 <p class="code">
-int cupsFilePrintf(<a href="#cups_file_t">cups_file_t</a> *fp, const char *format, ...);</p>
+void cupsDirClose(<a href="#cups_dir_t">cups_dir_t</a> *dp);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>format</th>
-<td class="description">Printf-style format string</td></tr>
-<tr><th>...</th>
-<td class="description">Additional args as necessary</td></tr>
+<tr><th>dp</th>
+<td class="description">Directory pointer</td></tr>
 </tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of bytes written or -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFilePutChar">cupsFilePutChar</a></h3>
-<p class="description">Write a character.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsDirOpen">cupsDirOpen</a></h3>
+<p class="description">Open a directory.</p>
 <p class="code">
-int cupsFilePutChar(<a href="#cups_file_t">cups_file_t</a> *fp, int c);</p>
+<a href="#cups_dir_t">cups_dir_t</a> *cupsDirOpen(const char *directory);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>c</th>
-<td class="description">Character to write</td></tr>
+<tr><th>directory</th>
+<td class="description">Directory name</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on success, -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsFilePutConf">cupsFilePutConf</a></h3>
-<p class="description">Write a configuration line.</p>
+<p class="description">Directory pointer or <code>NULL</code> if the directory could not be opened.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsDirRead">cupsDirRead</a></h3>
+<p class="description">Read the next directory entry.</p>
 <p class="code">
-ssize_t cupsFilePutConf(<a href="#cups_file_t">cups_file_t</a> *fp, const char *directive, const char *value);</p>
+<a href="#cups_dentry_t">cups_dentry_t</a> *cupsDirRead(<a href="#cups_dir_t">cups_dir_t</a> *dp);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>directive</th>
-<td class="description">Directive</td></tr>
+<tr><th>dp</th>
+<td class="description">Directory pointer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Directory entry or <code>NULL</code> when there are no more</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsDirRewind">cupsDirRewind</a></h3>
+<p class="description">Rewind to the start of the directory.</p>
+<p class="code">
+void cupsDirRewind(<a href="#cups_dir_t">cups_dir_t</a> *dp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dp</th>
+<td class="description">Directory pointer</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 1.1.20/macOS 10.4&#160;</span><a id="cupsDoAuthentication">cupsDoAuthentication</a></h3>
+<p class="description">Authenticate a request.</p>
+<p class="code">
+int cupsDoAuthentication(<a href="#http_t">http_t</a> *http, const char *method, const char *resource);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>method</th>
+<td class="description">Request method (&quot;GET&quot;, &quot;POST&quot;, &quot;PUT&quot;)</td></tr>
+<tr><th>resource</th>
+<td class="description">Resource path</td></tr>
+</tbody></table>
+<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 should be called in response to a <code>HTTP_STATUS_UNAUTHORIZED</code>
+status, prior to resubmitting your request.
+
+</p>
+<h3 class="function"><a id="cupsDoFileRequest">cupsDoFileRequest</a></h3>
+<p class="description">Do an IPP request with a file.</p>
+<p class="code">
+<a href="#ipp_t">ipp_t</a> *cupsDoFileRequest(<a href="#http_t">http_t</a> *http, <a href="#ipp_t">ipp_t</a> *request, const char *resource, const char *filename);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>request</th>
+<td class="description">IPP request</td></tr>
+<tr><th>resource</th>
+<td class="description">HTTP resource for POST</td></tr>
+<tr><th>filename</th>
+<td class="description">File to send or <code>NULL</code> for none</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Response data</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sends the IPP request and attached file to the specified
+server, retrying and authenticating as necessary.  The request is freed with
+<a href="#ippDelete"><code>ippDelete</code></a>.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.3/macOS 10.5&#160;</span><a id="cupsDoIORequest">cupsDoIORequest</a></h3>
+<p class="description">Do an IPP request with file descriptors.</p>
+<p class="code">
+<a href="#ipp_t">ipp_t</a> *cupsDoIORequest(<a href="#http_t">http_t</a> *http, <a href="#ipp_t">ipp_t</a> *request, const char *resource, int infile, int outfile);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>request</th>
+<td class="description">IPP request</td></tr>
+<tr><th>resource</th>
+<td class="description">HTTP resource for POST</td></tr>
+<tr><th>infile</th>
+<td class="description">File to read from or -1 for none</td></tr>
+<tr><th>outfile</th>
+<td class="description">File to write to or -1 for none</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Response data</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sends the IPP request with the optional input file &quot;infile&quot; to
+the specified server, retrying and authenticating as necessary.  The request
+is freed with <a href="#ippDelete"><code>ippDelete</code></a>.<br>
+<br>
+If &quot;infile&quot; is a valid file descriptor, <code>cupsDoIORequest</code> copies
+all of the data from the file after the IPP request message.<br>
+<br>
+If &quot;outfile&quot; is a valid file descriptor, <code>cupsDoIORequest</code> copies
+all of the data after the IPP response message to the file.
+
+</p>
+<h3 class="function"><a id="cupsDoRequest">cupsDoRequest</a></h3>
+<p class="description">Do an IPP request.</p>
+<p class="code">
+<a href="#ipp_t">ipp_t</a> *cupsDoRequest(<a href="#http_t">http_t</a> *http, <a href="#ipp_t">ipp_t</a> *request, const char *resource);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>request</th>
+<td class="description">IPP request</td></tr>
+<tr><th>resource</th>
+<td class="description">HTTP resource for POST</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Response data</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sends the IPP request to the specified server, retrying
+and authenticating as necessary.  The request is freed with <a href="#ippDelete"><code>ippDelete</code></a>.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.3/macOS 10.14&#160;</span><a id="cupsEncodeOption">cupsEncodeOption</a></h3>
+<p class="description">Encode a single option into an IPP attribute.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *cupsEncodeOption(<a href="#ipp_t">ipp_t</a> *ipp, ipp_tag_t group_tag, const char *name, const char *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ipp</th>
+<td class="description">IPP request/response</td></tr>
+<tr><th>group_tag</th>
+<td class="description">Attribute group</td></tr>
+<tr><th>name</th>
+<td class="description">Option name</td></tr>
 <tr><th>value</th>
-<td class="description">Value</td></tr>
+<td class="description">Option string value</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of bytes written or -1 on error</p>
+<p class="description">New attribute or <code>NULL</code> on error</p>
+<h3 class="function"><a id="cupsEncodeOptions">cupsEncodeOptions</a></h3>
+<p class="description">Encode printer options into IPP attributes.</p>
+<p class="code">
+void cupsEncodeOptions(<a href="#ipp_t">ipp_t</a> *ipp, int num_options, <a href="#cups_option_t">cups_option_t</a> *options);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ipp</th>
+<td class="description">IPP request/response</td></tr>
+<tr><th>num_options</th>
+<td class="description">Number of options</td></tr>
+<tr><th>options</th>
+<td class="description">Options</td></tr>
+</tbody></table>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function adds operation, job, and then subscription attributes,
+in that order. Use the <a href="#cupsEncodeOptions2"><code>cupsEncodeOptions2</code></a> function to add attributes
+for a single group.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsEncodeOptions2">cupsEncodeOptions2</a></h3>
+<p class="description">Encode printer options into IPP attributes for a group.</p>
+<p class="code">
+void cupsEncodeOptions2(<a href="#ipp_t">ipp_t</a> *ipp, int num_options, <a href="#cups_option_t">cups_option_t</a> *options, ipp_tag_t group_tag);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ipp</th>
+<td class="description">IPP request/response</td></tr>
+<tr><th>num_options</th>
+<td class="description">Number of options</td></tr>
+<tr><th>options</th>
+<td class="description">Options</td></tr>
+<tr><th>group_tag</th>
+<td class="description">Group to encode</td></tr>
+</tbody></table>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function only adds attributes for a single group. Call this
+function multiple times for each group, or use <a href="#cupsEncodeOptions"><code>cupsEncodeOptions</code></a>
+to add the standard groups.
+
+</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsEncryption">cupsEncryption</a></h3>
+<p class="description">Get the current encryption settings.</p>
+<p class="code">
+<a href="#http_encryption_t">http_encryption_t</a> cupsEncryption(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Encryption settings</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsEnumDests">cupsEnumDests</a></h3>
+<p class="description">Enumerate available destinations with a callback function.</p>
+<p class="code">
+int cupsEnumDests(unsigned flags, int msec, int *cancel, <a href="#cups_ptype_t">cups_ptype_t</a> type, <a href="#cups_ptype_t">cups_ptype_t</a> mask, <a href="#cups_dest_cb_t">cups_dest_cb_t</a> cb, void *user_data);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>flags</th>
+<td class="description">Enumeration flags</td></tr>
+<tr><th>msec</th>
+<td class="description">Timeout in milliseconds, -1 for indefinite</td></tr>
+<tr><th>cancel</th>
+<td class="description">Pointer to &quot;cancel&quot; variable</td></tr>
+<tr><th>type</th>
+<td class="description">Printer type bits</td></tr>
+<tr><th>mask</th>
+<td class="description">Mask for printer type bits</td></tr>
+<tr><th>cb</th>
+<td class="description">Callback function</td></tr>
+<tr><th>user_data</th>
+<td class="description">User data</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Destinations are enumerated from one or more sources.  The callback function
+receives the <code>user_data</code> pointer and the destination pointer which can
+be used as input to the <a href="#cupsCopyDest"><code>cupsCopyDest</code></a> function.  The function must
+return 1 to continue enumeration or 0 to stop.<br>
+<br>
+The <code>type</code> and <code>mask</code> arguments allow the caller to filter the
+destinations that are enumerated.  Passing 0 for both will enumerate all
+printers.  The constant <code>CUPS_PTYPE_DISCOVERED</code> is used to filter on
+destinations that are available but have not yet been added locally.<br>
+<br>
+Enumeration happens on the current thread and does not return until all
+destinations have been enumerated or the callback function returns 0.<br>
+<br>
+Note: The callback function will likely receive multiple updates for the same
+destinations - it is up to the caller to suppress any duplicate destinations.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileClose">cupsFileClose</a></h3>
+<p class="description">Close a CUPS file.</p>
+<p class="code">
+int cupsFileClose(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileEOF">cupsFileEOF</a></h3>
+<p class="description">Return the end-of-file status.</p>
+<p class="code">
+int cupsFileEOF(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on end of file, 0 otherwise</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileFind">cupsFileFind</a></h3>
+<p class="description">Find a file using the specified path.</p>
+<p class="code">
+const char *cupsFileFind(const char *filename, const char *path, int executable, char *buffer, int bufsize);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>filename</th>
+<td class="description">File to find</td></tr>
+<tr><th>path</th>
+<td class="description">Colon/semicolon-separated path</td></tr>
+<tr><th>executable</th>
+<td class="description">1 = executable files, 0 = any file/dir</td></tr>
+<tr><th>buffer</th>
+<td class="description">Filename buffer</td></tr>
+<tr><th>bufsize</th>
+<td class="description">Size of filename buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Full path to file or <code>NULL</code> if not found</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function allows the paths in the path string to be separated by
+colons (UNIX standard) or semicolons (Windows standard) and stores the
+result in the buffer supplied.  If the file cannot be found in any of
+the supplied paths, <code>NULL</code> is returned. A <code>NULL</code> path only
+matches the current directory.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileFlush">cupsFileFlush</a></h3>
+<p class="description">Flush pending output.</p>
+<p class="code">
+int cupsFileFlush(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileGetChar">cupsFileGetChar</a></h3>
+<p class="description">Get a single character from a file.</p>
+<p class="code">
+int cupsFileGetChar(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Character or -1 on end of file</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileGetConf">cupsFileGetConf</a></h3>
+<p class="description">Get a line from a configuration file.</p>
+<p class="code">
+char *cupsFileGetConf(<a href="#cups_file_t">cups_file_t</a> *fp, char *buf, size_t buflen, char **value, int *linenum);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>buf</th>
+<td class="description">String buffer</td></tr>
+<tr><th>buflen</th>
+<td class="description">Size of string buffer</td></tr>
+<tr><th>value</th>
+<td class="description">Pointer to value</td></tr>
+<tr><th>linenum</th>
+<td class="description">Current line number</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Line read or <code>NULL</code> on end of file or error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileGetLine">cupsFileGetLine</a></h3>
+<p class="description">Get a CR and/or LF-terminated line that may
+                      contain binary data.</p>
+<p class="code">
+size_t cupsFileGetLine(<a href="#cups_file_t">cups_file_t</a> *fp, char *buf, size_t buflen);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">File to read from</td></tr>
+<tr><th>buf</th>
+<td class="description">Buffer</td></tr>
+<tr><th>buflen</th>
+<td class="description">Size of buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes on line or 0 on end of file</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function differs from <a href="#cupsFileGets"><code>cupsFileGets</code></a> in that the trailing CR
+and LF are preserved, as is any binary data on the line. The buffer is
+nul-terminated, however you should use the returned length to determine
+the number of bytes on the line.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileGets">cupsFileGets</a></h3>
+<p class="description">Get a CR and/or LF-terminated line.</p>
+<p class="code">
+char *cupsFileGets(<a href="#cups_file_t">cups_file_t</a> *fp, char *buf, size_t buflen);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>buf</th>
+<td class="description">String buffer</td></tr>
+<tr><th>buflen</th>
+<td class="description">Size of string buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Line read or <code>NULL</code> on end of file or error</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsFileIsCompressed">cupsFileIsCompressed</a></h3>
+<p class="description">Return whether a file is compressed.</p>
+<p class="code">
+bool cupsFileIsCompressed(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> if file is compressed, <code>false</code> otherwise</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileLock">cupsFileLock</a></h3>
+<p class="description">Temporarily lock access to a file.</p>
+<p class="code">
+int cupsFileLock(<a href="#cups_file_t">cups_file_t</a> *fp, int block);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>block</th>
+<td class="description">1 to wait for the lock, 0 to fail right away</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileNumber">cupsFileNumber</a></h3>
+<p class="description">Return the file descriptor associated with a CUPS file.</p>
+<p class="code">
+int cupsFileNumber(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">File descriptor</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileOpen">cupsFileOpen</a></h3>
+<p class="description">Open a CUPS file.</p>
+<p class="code">
+<a href="#cups_file_t">cups_file_t</a> *cupsFileOpen(const char *filename, const char *mode);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>filename</th>
+<td class="description">Name of file</td></tr>
+<tr><th>mode</th>
+<td class="description">Open mode</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">CUPS file or <code>NULL</code> if the file or socket cannot be opened</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;mode&quot; parameter can be &quot;r&quot; to read, &quot;w&quot; to write, overwriting any
+existing file, &quot;a&quot; to append to an existing file or create a new file,
+or &quot;s&quot; to open a socket connection.<br>
+<br>
+When opening for writing (&quot;w&quot;), an optional number from 1 to 9 can be
+supplied which enables Flate compression of the file.  Compression is
+not supported for the &quot;a&quot; (append) mode.<br>
+<br>
+When opening a socket connection, the filename is a string of the form
+&quot;address:port&quot; or &quot;hostname:port&quot;. The socket will make an IPv4 or IPv6
+connection as needed, generally preferring IPv6 connections when there is
+a choice.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileOpenFd">cupsFileOpenFd</a></h3>
+<p class="description">Open a CUPS file using a file descriptor.</p>
+<p class="code">
+<a href="#cups_file_t">cups_file_t</a> *cupsFileOpenFd(int fd, const char *mode);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fd</th>
+<td class="description">File descriptor</td></tr>
+<tr><th>mode</th>
+<td class="description">Open mode</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">CUPS file or <code>NULL</code> if the file could not be opened</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;mode&quot; parameter can be &quot;r&quot; to read, &quot;w&quot; to write, &quot;a&quot; to append,
+or &quot;s&quot; to treat the file descriptor as a bidirectional socket connection.<br>
+<br>
+When opening for writing (&quot;w&quot;), an optional number from 1 to 9 can be
+supplied which enables Flate compression of the file.  Compression is
+not supported for the &quot;a&quot; (append) mode.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFilePeekChar">cupsFilePeekChar</a></h3>
+<p class="description">Peek at the next character from a file.</p>
+<p class="code">
+int cupsFilePeekChar(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Character or -1 on end of file</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFilePrintf">cupsFilePrintf</a></h3>
+<p class="description">Write a formatted string.</p>
+<p class="code">
+int cupsFilePrintf(<a href="#cups_file_t">cups_file_t</a> *fp, const char *format, ...);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>format</th>
+<td class="description">Printf-style format string</td></tr>
+<tr><th>...</th>
+<td class="description">Additional args as necessary</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes written or -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFilePutChar">cupsFilePutChar</a></h3>
+<p class="description">Write a character.</p>
+<p class="code">
+int cupsFilePutChar(<a href="#cups_file_t">cups_file_t</a> *fp, int c);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>c</th>
+<td class="description">Character to write</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsFilePutConf">cupsFilePutConf</a></h3>
+<p class="description">Write a configuration line.</p>
+<p class="code">
+ssize_t cupsFilePutConf(<a href="#cups_file_t">cups_file_t</a> *fp, const char *directive, const char *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>directive</th>
+<td class="description">Directive</td></tr>
+<tr><th>value</th>
+<td class="description">Value</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes written or -1 on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function handles any comment escaping of the value.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFilePuts">cupsFilePuts</a></h3>
+<p class="description">Write a string.</p>
+<p class="code">
+int cupsFilePuts(<a href="#cups_file_t">cups_file_t</a> *fp, const char *s);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>s</th>
+<td class="description">String to write</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes written or -1 on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Like the <code>fputs</code> function, no newline is appended to the string.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileRead">cupsFileRead</a></h3>
+<p class="description">Read from a file.</p>
+<p class="code">
+ssize_t cupsFileRead(<a href="#cups_file_t">cups_file_t</a> *fp, char *buf, size_t bytes);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>buf</th>
+<td class="description">Buffer</td></tr>
+<tr><th>bytes</th>
+<td class="description">Number of bytes to read</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes read or -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileRewind">cupsFileRewind</a></h3>
+<p class="description">Set the current file position to the beginning of the
+                     file.</p>
+<p class="code">
+off_t cupsFileRewind(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New file position or -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileSeek">cupsFileSeek</a></h3>
+<p class="description">Seek in a file.</p>
+<p class="code">
+off_t cupsFileSeek(<a href="#cups_file_t">cups_file_t</a> *fp, off_t pos);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>pos</th>
+<td class="description">Position in file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New file position or -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileStderr">cupsFileStderr</a></h3>
+<p class="description">Return a CUPS file associated with stderr.</p>
+<p class="code">
+<a href="#cups_file_t">cups_file_t</a> *cupsFileStderr(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">CUPS file</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileStdin">cupsFileStdin</a></h3>
+<p class="description">Return a CUPS file associated with stdin.</p>
+<p class="code">
+<a href="#cups_file_t">cups_file_t</a> *cupsFileStdin(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">CUPS file</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileStdout">cupsFileStdout</a></h3>
+<p class="description">Return a CUPS file associated with stdout.</p>
+<p class="code">
+<a href="#cups_file_t">cups_file_t</a> *cupsFileStdout(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">CUPS file</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileTell">cupsFileTell</a></h3>
+<p class="description">Return the current file position.</p>
+<p class="code">
+off_t cupsFileTell(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">File position</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileUnlock">cupsFileUnlock</a></h3>
+<p class="description">Unlock access to a file.</p>
+<p class="code">
+int cupsFileUnlock(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileWrite">cupsFileWrite</a></h3>
+<p class="description">Write to a file.</p>
+<p class="code">
+ssize_t cupsFileWrite(<a href="#cups_file_t">cups_file_t</a> *fp, const char *buf, size_t bytes);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>fp</th>
+<td class="description">CUPS file</td></tr>
+<tr><th>buf</th>
+<td class="description">Buffer</td></tr>
+<tr><th>bytes</th>
+<td class="description">Number of bytes to write</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes written or -1 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsFindDestDefault">cupsFindDestDefault</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *cupsFindDestDefault(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>option</th>
+<td class="description">Option/attribute name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsFindDestReady">cupsFindDestReady</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *cupsFindDestReady(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>option</th>
+<td class="description">Option/attribute name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsFindDestSupported">cupsFindDestSupported</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *cupsFindDestSupported(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>option</th>
+<td class="description">Option/attribute name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsFinishDestDocument">cupsFinishDestDocument</a></h3>
+<p class="description">Finish the current document.</p>
+<p class="code">
+ipp_status_t cupsFinishDestDocument(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *info);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>info</th>
+<td class="description">Destination information</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Status of document submission</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Returns <code>IPP_STATUS_OK</code> or <code>IPP_STATUS_OK_SUBST</code> on success.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsFormDecode">cupsFormDecode</a></h3>
+<p class="description">Decode URL-encoded form data.</p>
+<p class="code">
+int cupsFormDecode(const char *data, <a href="#cups_option_t">cups_option_t</a> **vars);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>data</th>
+<td class="description">URL-encoded form data</td></tr>
+<tr><th>vars</th>
+<td class="description">Array of variables</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of variables</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function decodes URL-encoded form data, returning the number of
+variables and a pointer to a <a href="#cups_option_t"><code>cups_option_t</code></a> array of the variables.<br>
+<br>
+Use the <a href="#cupsFreeOptions"><code>cupsFreeOptions</code></a> function to return the memory used when you
+are done with the form variables.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsFormEncode">cupsFormEncode</a></h3>
+<p class="description">Encode options as URL-encoded form data.</p>
+<p class="code">
+char *cupsFormEncode(const char *url, int num_vars, <a href="#cups_option_t">cups_option_t</a> *vars);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>url</th>
+<td class="description">URL or <code>NULL</code> for none</td></tr>
+<tr><th>num_vars</th>
+<td class="description">Number of variables</td></tr>
+<tr><th>vars</th>
+<td class="description">Variables</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">URL-encoded form data</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function encodes a CUPS options array as URL-encoded form data with an
+optional URL prefix, returning an allocated string.<br>
+<br>
+Use <code>free</code> to return the memory used for the string.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsFreeDestInfo">cupsFreeDestInfo</a></h3>
+<p class="description">Free destination information obtained using
+                       <a href="#cupsCopyDestInfo"><code>cupsCopyDestInfo</code></a>.</p>
+<p class="code">
+void cupsFreeDestInfo(<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsFreeDests">cupsFreeDests</a></h3>
+<p class="description">Free the memory used by the list of destinations.</p>
+<p class="code">
+void cupsFreeDests(int num_dests, <a href="#cups_dest_t">cups_dest_t</a> *dests);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>num_dests</th>
+<td class="description">Number of destinations</td></tr>
+<tr><th>dests</th>
+<td class="description">Destinations</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsFreeJobs">cupsFreeJobs</a></h3>
+<p class="description">Free memory used by job data.</p>
+<p class="code">
+void cupsFreeJobs(int num_jobs, <a href="#cups_job_t">cups_job_t</a> *jobs);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>num_jobs</th>
+<td class="description">Number of jobs</td></tr>
+<tr><th>jobs</th>
+<td class="description">Jobs</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsFreeOptions">cupsFreeOptions</a></h3>
+<p class="description">Free all memory used by options.</p>
+<p class="code">
+void cupsFreeOptions(int num_options, <a href="#cups_option_t">cups_option_t</a> *options);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>num_options</th>
+<td class="description">Number of options</td></tr>
+<tr><th>options</th>
+<td class="description">Pointer to options</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsGetCredentialsExpiration">cupsGetCredentialsExpiration</a></h3>
+<p class="description">Return the expiration date of the credentials.</p>
+<p class="code">
+time_t cupsGetCredentialsExpiration(const char *credentials);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>credentials</th>
+<td class="description">Credentials</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Expiration date of credentials</p>
+<h3 class="function"><a id="cupsGetCredentialsInfo">cupsGetCredentialsInfo</a></h3>
+<p class="description">Return a string describing the credentials.</p>
+<p class="code">
+char *cupsGetCredentialsInfo(const char *credentials, char *buffer, size_t bufsize);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>credentials</th>
+<td class="description">Credentials</td></tr>
+<tr><th>buffer</th>
+<td class="description">Buffer</td></tr>
+<tr><th>bufsize</th>
+<td class="description">Size of buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Credentials description or <code>NULL</code> on error</p>
+<h3 class="function"><a id="cupsGetCredentialsTrust">cupsGetCredentialsTrust</a></h3>
+<p class="description">Return the trust of credentials.</p>
+<p class="code">
+<a href="#http_trust_t">http_trust_t</a> cupsGetCredentialsTrust(const char *path, const char *common_name, const char *credentials);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>path</th>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
+<tr><th>common_name</th>
+<td class="description">Common name for trust lookup</td></tr>
+<tr><th>credentials</th>
+<td class="description">Credentials</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Level of trust</p>
+<h3 class="function"><a id="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(const char *name, const char *instance, int num_dests, <a href="#cups_dest_t">cups_dest_t</a> *dests);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>name</th>
+<td class="description">Destination name or <code>NULL</code> for the default destination</td></tr>
+<tr><th>instance</th>
+<td class="description">Instance name or <code>NULL</code></td></tr>
+<tr><th>num_dests</th>
+<td class="description">Number of destinations</td></tr>
+<tr><th>dests</th>
+<td class="description">Destinations</td></tr>
+</tbody></table>
+<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="#cupsEnumDests"><code>cupsEnumDests</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"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsGetDestMediaByIndex">cupsGetDestMediaByIndex</a></h3>
+<p class="description">Get a media name, dimension, and margins for a
+                              specific size.</p>
+<p class="code">
+int cupsGetDestMediaByIndex(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, int n, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>n</th>
+<td class="description">Media size number (0-based)</td></tr>
+<tr><th>flags</th>
+<td class="description">Media flags</td></tr>
+<tr><th>size</th>
+<td class="description">Media size information</td></tr>
+</tbody></table>
+<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 <code>flags</code> parameter determines which set of media are indexed.  For
+example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will get the Nth
+borderless size supported by the printer.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsGetDestMediaByIndex2">cupsGetDestMediaByIndex2</a></h3>
+<p class="description">Get specific media information.</p>
+<p class="code">
+bool cupsGetDestMediaByIndex2(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, size_t n, unsigned flags, <a href="#cups_media_t">cups_media_t</a> *media);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>n</th>
+<td class="description">Media number (0-based)</td></tr>
+<tr><th>flags</th>
+<td class="description">Media flags</td></tr>
+<tr><th>media</th>
+<td class="description">Media information</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines which set of media are indexed.  For
+example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will get the Nth
+borderless size supported by the printer.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsGetDestMediaByName">cupsGetDestMediaByName</a></h3>
+<p class="description">Get media names, dimensions, and margins.</p>
+<p class="code">
+int cupsGetDestMediaByName(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *name, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>name</th>
+<td class="description">Media name</td></tr>
+<tr><th>flags</th>
+<td class="description">Media matching flags</td></tr>
+<tr><th>size</th>
+<td class="description">Media size information</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on match, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;media&quot; string is a PWG media name.  &quot;Flags&quot; provides some matching
+guidance (multiple flags can be combined):<br>
+<br>
+CUPS_MEDIA_FLAGS_DEFAULT    = find the closest size supported by the printer,
+CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size,
+CUPS_MEDIA_FLAGS_DUPLEX     = find a size compatible with 2-sided printing,
+CUPS_MEDIA_FLAGS_EXACT      = find an exact match for the size, and
+CUPS_MEDIA_FLAGS_READY      = if the printer supports media sensing, find the
+                              size amongst the &quot;ready&quot; media.<br>
+<br>
+The matching result (if any) is returned in the &quot;cups_size_t&quot; structure.<br>
+<br>
+Returns 1 when there is a match and 0 if there is not a match.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsGetDestMediaByName2">cupsGetDestMediaByName2</a></h3>
+<p class="description">Get media names, dimensions, and margins.</p>
+<p class="code">
+bool cupsGetDestMediaByName2(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *name, unsigned flags, <a href="#cups_media_t">cups_media_t</a> *media);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>name</th>
+<td class="description">Media name</td></tr>
+<tr><th>flags</th>
+<td class="description">Media matching flags</td></tr>
+<tr><th>media</th>
+<td class="description">Media information</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on match, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;media&quot; string is a PWG media name.  &quot;Flags&quot; provides some matching
+guidance (multiple flags can be combined):<br>
+<br>
+CUPS_MEDIA_FLAGS_DEFAULT    = find the closest size supported by the printer,
+CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size,
+CUPS_MEDIA_FLAGS_DUPLEX     = find a size compatible with 2-sided printing,
+CUPS_MEDIA_FLAGS_EXACT      = find an exact match for the size, and
+CUPS_MEDIA_FLAGS_READY      = if the printer supports media sensing, find the
+                              size amongst the &quot;ready&quot; media.<br>
+<br>
+The matching result (if any) is returned in the &quot;cups_size_t&quot; structure.<br>
+<br>
+Returns <code>true</code> when there is a match and <code>false</code> if there is not a match.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsGetDestMediaBySize">cupsGetDestMediaBySize</a></h3>
+<p class="description">Get media names, dimensions, and margins.</p>
+<p class="code">
+int cupsGetDestMediaBySize(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, int width, int length, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>width</th>
+<td class="description">Media width in hundredths of
+    of millimeters</td></tr>
+<tr><th>length</th>
+<td class="description">Media length in hundredths of
+    of millimeters</td></tr>
+<tr><th>flags</th>
+<td class="description">Media matching flags</td></tr>
+<tr><th>size</th>
+<td class="description">Media size information</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on match, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">&quot;Width&quot; and &quot;length&quot; are the dimensions in hundredths of millimeters.
+&quot;Flags&quot; provides some matching guidance (multiple flags can be combined):<br>
+<br>
+CUPS_MEDIA_FLAGS_DEFAULT    = find the closest size supported by the printer,
+CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size,
+CUPS_MEDIA_FLAGS_DUPLEX     = find a size compatible with 2-sided printing,
+CUPS_MEDIA_FLAGS_EXACT      = find an exact match for the size, and
+CUPS_MEDIA_FLAGS_READY      = if the printer supports media sensing, find the
+                              size amongst the &quot;ready&quot; media.<br>
+<br>
+The matching result (if any) is returned in the &quot;cups_size_t&quot; structure.<br>
+<br>
+Returns 1 when there is a match and 0 if there is not a match.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsGetDestMediaBySize2">cupsGetDestMediaBySize2</a></h3>
+<p class="description">Get media names, dimensions, and margins.</p>
+<p class="code">
+bool cupsGetDestMediaBySize2(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, int width, int length, unsigned flags, <a href="#cups_media_t">cups_media_t</a> *media);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>width</th>
+<td class="description">Media width in hundredths of millimeters</td></tr>
+<tr><th>length</th>
+<td class="description">Media length in hundredths of millimeters</td></tr>
+<tr><th>flags</th>
+<td class="description">Media matching flags</td></tr>
+<tr><th>media</th>
+<td class="description">Media information</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on match, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">&quot;Width&quot; and &quot;length&quot; are the dimensions in hundredths of millimeters.
+&quot;Flags&quot; provides some matching guidance (multiple flags can be combined):<br>
+<br>
+CUPS_MEDIA_FLAGS_DEFAULT    = find the closest size supported by the printer,
+CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size,
+CUPS_MEDIA_FLAGS_DUPLEX     = find a size compatible with 2-sided printing,
+CUPS_MEDIA_FLAGS_EXACT      = find an exact match for the size, and
+CUPS_MEDIA_FLAGS_READY      = if the printer supports media sensing, find the
+                              size amongst the &quot;ready&quot; media.<br>
+<br>
+The matching result (if any) is returned in the &quot;cups_size_t&quot; structure.<br>
+<br>
+Returns <code>true</code> when there is a match and <code>false</code> if there is not a match.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsGetDestMediaCount">cupsGetDestMediaCount</a></h3>
+<p class="description">Get the number of sizes supported by a
+                            destination.</p>
+<p class="code">
+int cupsGetDestMediaCount(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, unsigned flags);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>flags</th>
+<td class="description">Media flags</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of sizes</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines the set of media sizes that are
+counted.  For example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return
+the number of borderless sizes.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsGetDestMediaDefault">cupsGetDestMediaDefault</a></h3>
+<p class="description">Get the default size for a destination.</p>
+<p class="code">
+int cupsGetDestMediaDefault(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>flags</th>
+<td class="description">Media flags</td></tr>
+<tr><th>size</th>
+<td class="description">Media size information</td></tr>
+</tbody></table>
+<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 <code>flags</code> parameter determines which default size is returned.  For
+example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return the default
+borderless size, typically US Letter or A4, but sometimes 4x6 photo media.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsGetDestMediaDefault2">cupsGetDestMediaDefault2</a></h3>
+<p class="description">Get the default size for a destination.</p>
+<p class="code">
+bool cupsGetDestMediaDefault2(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, unsigned flags, <a href="#cups_media_t">cups_media_t</a> *media);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to destination</td></tr>
+<tr><th>dest</th>
+<td class="description">Destination</td></tr>
+<tr><th>dinfo</th>
+<td class="description">Destination information</td></tr>
+<tr><th>flags</th>
+<td class="description">Media flags</td></tr>
+<tr><th>media</th>
+<td class="description">Media information</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on match, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines which default size is returned.  For
+example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return the default
+borderless size, typically US Letter or A4, but sometimes 4x6 photo media.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="cupsGetDestWithURI">cupsGetDestWithURI</a></h3>
+<p class="description">Get a destination associated with a URI.</p>
+<p class="code">
+<a href="#cups_dest_t">cups_dest_t</a> *cupsGetDestWithURI(const char *name, const char *uri);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>name</th>
+<td class="description">Desired printer name or <code>NULL</code></td></tr>
+<tr><th>uri</th>
+<td class="description">URI for the printer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Destination or <code>NULL</code></p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">&quot;name&quot; is the desired name for the printer. If <code>NULL</code>, a name will be
+created using the URI.<br>
+<br>
+&quot;uri&quot; is the &quot;ipp&quot; or &quot;ipps&quot; URI for the printer.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.1.21/macOS 10.4&#160;</span><a id="cupsGetDests2">cupsGetDests2</a></h3>
+<p class="description">Get the list of destinations from the specified server.</p>
+<p class="code">
+int cupsGetDests2(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> **dests);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>dests</th>
+<td class="description">Destinations</td></tr>
+</tbody></table>
+<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
+&quot;printer-info&quot;, &quot;printer-is-accepting-jobs&quot;, &quot;printer-is-shared&quot;,
+&quot;printer-make-and-model&quot;, &quot;printer-state&quot;, &quot;printer-state-change-time&quot;,
+&quot;printer-state-reasons&quot;, &quot;printer-type&quot;, and &quot;printer-uri-supported&quot;
+attributes as options.<br>
+<br>
+CUPS 1.4 adds the &quot;marker-change-time&quot;, &quot;marker-colors&quot;,
+&quot;marker-high-levels&quot;, &quot;marker-levels&quot;, &quot;marker-low-levels&quot;, &quot;marker-message&quot;,
+&quot;marker-names&quot;, &quot;marker-types&quot;, and &quot;printer-commands&quot; attributes as options.<br>
+<br>
+CUPS 2.2 adds accessible IPP printers to the list of destinations that can
+be used.  The &quot;printer-uri-supported&quot; option will be present for those IPP
+printers that have been recently used.<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">&#160;CUPS 2.5&#160;</span><a id="cupsGetEncryption">cupsGetEncryption</a></h3>
+<p class="description">Get the current encryption settings.</p>
+<p class="code">
+<a href="#http_encryption_t">http_encryption_t</a> cupsGetEncryption(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_ENCRYPTION_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">&#160;CUPS 2.5&#160;</span><a id="cupsGetError">cupsGetError</a></h3>
+<p class="description">Return the last IPP status code received on the current thread.</p>
+<p class="code">
+ipp_status_t cupsGetError(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">IPP status code from last request</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsGetErrorString">cupsGetErrorString</a></h3>
+<p class="description">Return the last IPP status-message received on the current thread.</p>
+<p class="code">
+const char *cupsGetErrorString(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">status-message text from last request</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.1.20/macOS 10.4&#160;</span><a id="cupsGetFd">cupsGetFd</a></h3>
+<p class="description">Get a file from the server.</p>
+<p class="code">
+http_status_t cupsGetFd(<a href="#http_t">http_t</a> *http, const char *resource, int fd);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>resource</th>
+<td class="description">Resource name</td></tr>
+<tr><th>fd</th>
+<td class="description">File descriptor</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">HTTP status</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns <code>HTTP_STATUS_OK</code> when the file is successfully retrieved.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.1.20/macOS 10.4&#160;</span><a id="cupsGetFile">cupsGetFile</a></h3>
+<p class="description">Get a file from the server.</p>
+<p class="code">
+http_status_t cupsGetFile(<a href="#http_t">http_t</a> *http, const char *resource, const char *filename);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>resource</th>
+<td class="description">Resource name</td></tr>
+<tr><th>filename</th>
+<td class="description">Filename</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">HTTP status</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns <code>HTTP_STATUS_OK</code> when the file is successfully retrieved.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.2.4/macOS 10.13&#160;</span><a id="cupsGetIntegerOption">cupsGetIntegerOption</a></h3>
+<p class="description">Get an integer option value.</p>
+<p class="code">
+int cupsGetIntegerOption(const char *name, int num_options, <a href="#cups_option_t">cups_option_t</a> *options);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>name</th>
+<td class="description">Name of option</td></tr>
+<tr><th>num_options</th>
+<td class="description">Number of options</td></tr>
+<tr><th>options</th>
+<td class="description">Options</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Option value or <code>INT_MIN</code></p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">INT_MIN is returned when the option does not exist, is not an integer, or
+exceeds the range of values for the &quot;int&quot; type.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.1.21/macOS 10.4&#160;</span><a id="cupsGetJobs2">cupsGetJobs2</a></h3>
+<p class="description">Get the jobs from the specified server.</p>
+<p class="code">
+int cupsGetJobs2(<a href="#http_t">http_t</a> *http, <a href="#cups_job_t">cups_job_t</a> **jobs, const char *name, int myjobs, int whichjobs);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>jobs</th>
+<td class="description">Job data</td></tr>
+<tr><th>name</th>
+<td class="description"><code>NULL</code> = all destinations, otherwise show jobs for named destination</td></tr>
+<tr><th>myjobs</th>
+<td class="description">0 = all users, 1 = mine</td></tr>
+<tr><th>whichjobs</th>
+<td class="description"><code>CUPS_WHICHJOBS_ALL</code>, <code>CUPS_WHICHJOBS_ACTIVE</code>, or <code>CUPS_WHICHJOBS_COMPLETED</code></td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of jobs</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">A &quot;whichjobs&quot; 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">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="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(<a href="#http_t">http_t</a> *http, const char *name, const char *instance);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>name</th>
+<td class="description">Destination name or <code>NULL</code> for the default destination</td></tr>
+<tr><th>instance</th>
+<td class="description">Instance name or <code>NULL</code></td></tr>
+</tbody></table>
+<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="#cupsGetDests2"><code>cupsGetDests2</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 &quot;http&quot; is <code>CUPS_HTTP_DEFAULT</code>, the connection to the default print
+server will be used.<br>
+<br>
+If &quot;name&quot; 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
+&quot;num_dests&quot; value of 1.
+
+</p>
+<h3 class="function"><a id="cupsGetOption">cupsGetOption</a></h3>
+<p class="description">Get an option value.</p>
+<p class="code">
+const char *cupsGetOption(const char *name, int num_options, <a href="#cups_option_t">cups_option_t</a> *options);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>name</th>
+<td class="description">Name of option</td></tr>
+<tr><th>num_options</th>
+<td class="description">Number of options</td></tr>
+<tr><th>options</th>
+<td class="description">Options</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Option value or <code>NULL</code></p>
+<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsGetPassword2">cupsGetPassword2</a></h3>
+<p class="description">Get a password from the user using the current
+                       password callback.</p>
+<p class="code">
+const char *cupsGetPassword2(const char *prompt, <a href="#http_t">http_t</a> *http, const char *method, const char *resource);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>prompt</th>
+<td class="description">Prompt string</td></tr>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>method</th>
+<td class="description">Request method (&quot;GET&quot;, &quot;POST&quot;, &quot;PUT&quot;)</td></tr>
+<tr><th>resource</th>
+<td class="description">Resource path</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Password</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function handles any comment escaping of the value.
+<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="#cupsSetPasswordCB2"><code>cupsSetPasswordCB2</code></a> function need to do so in each thread for the
+same function to be used.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFilePuts">cupsFilePuts</a></h3>
-<p class="description">Write a string.</p>
+<h3 class="function"><a id="cupsGetRand">cupsGetRand</a></h3>
+<p class="description">Return a 32-bit pseudo-random number.</p>
 <p class="code">
-int cupsFilePuts(<a href="#cups_file_t">cups_file_t</a> *fp, const char *s);</p>
+unsigned cupsGetRand(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Random number</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns a 32-bit pseudo-random number suitable for use as
+one-time identifiers or nonces.  The random numbers are generated/seeded
+using system entropy.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsGetResponse">cupsGetResponse</a></h3>
+<p class="description">Get a response to an IPP request.</p>
+<p class="code">
+<a href="#ipp_t">ipp_t</a> *cupsGetResponse(<a href="#http_t">http_t</a> *http, const char *resource);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>s</th>
-<td class="description">String to write</td></tr>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>resource</th>
+<td class="description">HTTP resource for POST</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of bytes written or -1 on error</p>
+<p class="description">Response or <code>NULL</code> on HTTP error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Like the <code>fputs</code> function, no newline is appended to the string.
+<p class="discussion">Use this function to get the response for an IPP request sent using
+<a href="#cupsSendRequest"><code>cupsSendRequest</code></a>. For requests that return additional data, use
+<a href="#cupsReadResponseData"><code>cupsReadResponseData</code></a> after getting a successful response,
+otherwise call <a href="#httpFlush"><code>httpFlush</code></a> to complete the response processing.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileRead">cupsFileRead</a></h3>
-<p class="description">Read from a file.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsGetServer">cupsGetServer</a></h3>
+<p class="description">Return the hostname/address of the current server.</p>
 <p class="code">
-ssize_t cupsFileRead(<a href="#cups_file_t">cups_file_t</a> *fp, char *buf, size_t bytes);</p>
+const char *cupsGetServer(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 &quot;localhost&quot; 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">&#160;CUPS 2.5&#160;</span><a id="cupsGetUser">cupsGetUser</a></h3>
+<p class="description">Return the current user's name.</p>
+<p class="code">
+const char *cupsGetUser(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>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsGetUserAgent">cupsGetUserAgent</a></h3>
+<p class="description">Return the default HTTP User-Agent string.</p>
+<p class="code">
+const char *cupsGetUserAgent(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">User-Agent string</p>
+<h3 class="function"><a id="cupsHMACData">cupsHMACData</a></h3>
+<p class="description">Perform a HMAC function on the given data.</p>
+<p class="code">
+ssize_t cupsHMACData(const char *algorithm, const unsigned char *key, size_t keylen, const void *data, size_t datalen, unsigned char *hmac, size_t hmacsize);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>buf</th>
-<td class="description">Buffer</td></tr>
-<tr><th>bytes</th>
-<td class="description">Number of bytes to read</td></tr>
+<tr><th>algorithm</th>
+<td class="description">Hash algorithm</td></tr>
+<tr><th>key</th>
+<td class="description">Key</td></tr>
+<tr><th>keylen</th>
+<td class="description">Length of key</td></tr>
+<tr><th>data</th>
+<td class="description">Data to hash</td></tr>
+<tr><th>datalen</th>
+<td class="description">Length of data to hash</td></tr>
+<tr><th>hmac</th>
+<td class="description">HMAC buffer</td></tr>
+<tr><th>hmacsize</th>
+<td class="description">Size of HMAC buffer</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of bytes read or -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileRewind">cupsFileRewind</a></h3>
-<p class="description">Set the current file position to the beginning of the
-file.</p>
+<p class="description">The length of the HMAC or <code>-1</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function performs a HMAC function on the given data with the given key.
+The &quot;algorithm&quot; argument can be any of the registered, non-deprecated IPP
+hash algorithms for the &quot;job-password-encryption&quot; attribute, including
+&quot;sha&quot; for SHA-1, &quot;sha2-256&quot; for SHA2-256, etc.<br>
+<br>
+The &quot;hmac&quot; argument points to a buffer of &quot;hmacsize&quot; bytes and should be at
+least 64 bytes in length for all of the supported algorithms.<br>
+<br>
+The returned HMAC is binary data.</p>
+<h3 class="function"><a id="cupsHashData">cupsHashData</a></h3>
+<p class="description">Perform a hash function on the given data.</p>
 <p class="code">
-off_t cupsFileRewind(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+ssize_t cupsHashData(const char *algorithm, const void *data, size_t datalen, unsigned char *hash, size_t hashsize);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>algorithm</th>
+<td class="description">Algorithm name</td></tr>
+<tr><th>data</th>
+<td class="description">Data to hash</td></tr>
+<tr><th>datalen</th>
+<td class="description">Length of data to hash</td></tr>
+<tr><th>hash</th>
+<td class="description">Hash buffer</td></tr>
+<tr><th>hashsize</th>
+<td class="description">Size of hash buffer</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">New file position or -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileSeek">cupsFileSeek</a></h3>
-<p class="description">Seek in a file.</p>
+<p class="description">Size of hash or -1 on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function performs a hash function on the given data. The &quot;algorithm&quot;
+argument can be any of the registered, non-deprecated IPP hash algorithms for
+the &quot;job-password-encryption&quot; attribute, including &quot;sha&quot; for SHA-1,
+&quot;sha2-256&quot; for SHA2-256, etc.<br>
+<br>
+The &quot;hash&quot; argument points to a buffer of &quot;hashsize&quot; bytes and should be at
+least 64 bytes in length for all of the supported algorithms.<br>
+<br>
+The returned hash is binary data.</p>
+<h3 class="function"><a id="cupsHashString">cupsHashString</a></h3>
+<p class="description">Format a hash value as a hexadecimal string.</p>
 <p class="code">
-off_t cupsFileSeek(<a href="#cups_file_t">cups_file_t</a> *fp, off_t pos);</p>
+const char *cupsHashString(const unsigned char *hash, size_t hashsize, char *buffer, size_t bufsize);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>pos</th>
-<td class="description">Position in file</td></tr>
+<tr><th>hash</th>
+<td class="description">Hash</td></tr>
+<tr><th>hashsize</th>
+<td class="description">Size of hash</td></tr>
+<tr><th>buffer</th>
+<td class="description">String buffer</td></tr>
+<tr><th>bufsize</th>
+<td class="description">Size of string buffer</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">New file position or -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileStderr">cupsFileStderr</a></h3>
-<p class="description">Return a CUPS file associated with stderr.</p>
+<p class="description">Formatted string</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The passed buffer must be at least 2 * hashsize + 1 characters in length.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONDelete">cupsJSONDelete</a></h3>
+<p class="description">Delete a JSON node and all of its children.</p>
 <p class="code">
-<a href="#cups_file_t">cups_file_t</a> *cupsFileStderr(void);</p>
+void cupsJSONDelete(<a href="#cups_json_t">cups_json_t</a> *json);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>json</th>
+<td class="description">JSON node</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONExportFile">cupsJSONExportFile</a></h3>
+<p class="description">Save a JSON node tree to a file.</p>
+<p class="code">
+bool cupsJSONExportFile(<a href="#cups_json_t">cups_json_t</a> *json, const char *filename);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>json</th>
+<td class="description">JSON root node</td></tr>
+<tr><th>filename</th>
+<td class="description">JSON filename</td></tr>
+</tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">CUPS file</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileStdin">cupsFileStdin</a></h3>
-<p class="description">Return a CUPS file associated with stdin.</p>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONExportString">cupsJSONExportString</a></h3>
+<p class="description">Save a JSON node tree to a string.</p>
 <p class="code">
-<a href="#cups_file_t">cups_file_t</a> *cupsFileStdin(void);</p>
+char *cupsJSONExportString(<a href="#cups_json_t">cups_json_t</a> *json);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>json</th>
+<td class="description">JSON root node</td></tr>
+</tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">CUPS file</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileStdout">cupsFileStdout</a></h3>
-<p class="description">Return a CUPS file associated with stdout.</p>
+<p class="description">JSON string or <code>NULL</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function saves a JSON node tree to an allocated string.  The resulting
+string must be freed using the <code>free</code> function.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONFind">cupsJSONFind</a></h3>
+<p class="description">Find the value(s) associated with a given key.</p>
 <p class="code">
-<a href="#cups_file_t">cups_file_t</a> *cupsFileStdout(void);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONFind(<a href="#cups_json_t">cups_json_t</a> *json, const char *key);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>json</th>
+<td class="description">JSON object node</td></tr>
+<tr><th>key</th>
+<td class="description">Object key</td></tr>
+</tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">CUPS file</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileTell">cupsFileTell</a></h3>
-<p class="description">Return the current file position.</p>
+<p class="description">JSON value or <code>NULL</code></p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONGetChild">cupsJSONGetChild</a></h3>
+<p class="description">Get the first child node of an array or object node.</p>
 <p class="code">
-off_t cupsFileTell(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONGetChild(<a href="#cups_json_t">cups_json_t</a> *json, size_t n);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>json</th>
+<td class="description">JSON array or object node</td></tr>
+<tr><th>n</th>
+<td class="description">Child node number (starting at <code>0</code>)</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">File position</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileUnlock">cupsFileUnlock</a></h3>
-<p class="description">Unlock access to a file.</p>
+<p class="description">First child node or <code>NULL</code></p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONGetCount">cupsJSONGetCount</a></h3>
+<p class="description">Get the number of child nodes.</p>
 <p class="code">
-int cupsFileUnlock(<a href="#cups_file_t">cups_file_t</a> *fp);</p>
+size_t cupsJSONGetCount(<a href="#cups_json_t">cups_json_t</a> *json);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
+<tr><th>json</th>
+<td class="description">JSON array or object node</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on success, -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsFileWrite">cupsFileWrite</a></h3>
-<p class="description">Write to a file.</p>
+<p class="description">Number of child nodes</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONGetKey">cupsJSONGetKey</a></h3>
+<p class="description">Get the key string, if any.</p>
 <p class="code">
-ssize_t cupsFileWrite(<a href="#cups_file_t">cups_file_t</a> *fp, const char *buf, size_t bytes);</p>
+const char *cupsJSONGetKey(<a href="#cups_json_t">cups_json_t</a> *json);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>fp</th>
-<td class="description">CUPS file</td></tr>
-<tr><th>buf</th>
-<td class="description">Buffer</td></tr>
-<tr><th>bytes</th>
-<td class="description">Number of bytes to write</td></tr>
+<tr><th>json</th>
+<td class="description">JSON string node</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of bytes written or -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsFindDestDefault">cupsFindDestDefault</a></h3>
-<p class="description">Find the default value(s) for the given option.</p>
+<p class="description">String value</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns the key string for a JSON key node or <code>NULL</code> if
+the node is not a key.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONGetNumber">cupsJSONGetNumber</a></h3>
+<p class="description">Get the number value, if any.</p>
 <p class="code">
-<a href="#ipp_attribute_t">ipp_attribute_t</a> *cupsFindDestDefault(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option);</p>
+double cupsJSONGetNumber(<a href="#cups_json_t">cups_json_t</a> *json);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
-<tr><th>option</th>
-<td class="description">Option/attribute name</td></tr>
+<tr><th>json</th>
+<td class="description">JSON number node</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Default attribute or <code>NULL</code> for none</p>
+<p class="description">Number value</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
-<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
-<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
-<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
-functions to inspect the default value(s) as needed.
+<p class="discussion">This function returns the number value for a JSON number node or <code>0.0</code> if
+the node is not a number.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsFindDestReady">cupsFindDestReady</a></h3>
-<p class="description">Find the default value(s) for the given option.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONGetParent">cupsJSONGetParent</a></h3>
+<p class="description">Get the parent node, if any.</p>
 <p class="code">
-<a href="#ipp_attribute_t">ipp_attribute_t</a> *cupsFindDestReady(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONGetParent(<a href="#cups_json_t">cups_json_t</a> *json);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
-<tr><th>option</th>
-<td class="description">Option/attribute name</td></tr>
+<tr><th>json</th>
+<td class="description">JSON node</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Default attribute or <code>NULL</code> for none</p>
+<p class="description">Parent node or <code>NULL</code> if none</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONGetSibling">cupsJSONGetSibling</a></h3>
+<p class="description">Get the next sibling node, if any.</p>
+<p class="code">
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONGetSibling(<a href="#cups_json_t">cups_json_t</a> *json);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>json</th>
+<td class="description">JSON node</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Sibling node or <code>NULL</code> if none</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONGetString">cupsJSONGetString</a></h3>
+<p class="description">Get the string value, if any.</p>
+<p class="code">
+const char *cupsJSONGetString(<a href="#cups_json_t">cups_json_t</a> *json);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>json</th>
+<td class="description">JSON string node</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">String value</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
-<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
-<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
-<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
-functions to inspect the default value(s) as needed.
+<p class="discussion">This function returns the string value for a JSON string node or <code>NULL</code> if
+the node is not a string.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsFindDestSupported">cupsFindDestSupported</a></h3>
-<p class="description">Find the default value(s) for the given option.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONGetType">cupsJSONGetType</a></h3>
+<p class="description">Get the type of a JSON node.</p>
 <p class="code">
-<a href="#ipp_attribute_t">ipp_attribute_t</a> *cupsFindDestSupported(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option);</p>
+<a href="#cups_jtype_t">cups_jtype_t</a> cupsJSONGetType(<a href="#cups_json_t">cups_json_t</a> *json);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
-<tr><th>option</th>
-<td class="description">Option/attribute name</td></tr>
+<tr><th>json</th>
+<td class="description">JSON node</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">JSON node type</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONImportFile">cupsJSONImportFile</a></h3>
+<p class="description">Load a JSON object file.</p>
+<p class="code">
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONImportFile(const char *filename);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>filename</th>
+<td class="description">JSON filename</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Root JSON object node</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONImportString">cupsJSONImportString</a></h3>
+<p class="description">Load a JSON object from a string.</p>
+<p class="code">
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONImportString(const char *s);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>s</th>
+<td class="description">JSON string</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Root JSON object node</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONImportURL">cupsJSONImportURL</a></h3>
+<p class="description">Load a JSON object from a URL.</p>
+<p class="code">
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONImportURL(const char *url, time_t *last_modified);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>url</th>
+<td class="description">URL</td></tr>
+<tr><th>last_modified</th>
+<td class="description">Last modified date/time or <code>NULL</code></td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Root JSON object node</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function loads a JSON object from a URL.  The &quot;url&quot; can be a &quot;http:&quot; or
+&quot;https:&quot; URL.  The &quot;last_modified&quot; argument provides a pointer to a <code>time_t</code>
+variable with the last modified date and time from a previous load.  If
+<code>NULL</code> or the variable has a value of 0, the JSON is loaded unconditionally
+from the URL.<br>
+<br>
+On success, a pointer to the root JSON object node is returned and the
+&quot;last_modified&quot; variable, if not <code>NULL</code>, is updated to the Last-Modified
+date and time returned by the server.  Otherwise, <code>NULL</code> is returned with
+the <a href="#cupsGetError"><code>cupsGetError</code></a> value set to <code>IPP_STATUS_OK_EVENTS_COMPLETE</code> if
+the JSON data has not been updated since the &quot;last_modified&quot; date and time
+or a suitable <code>IPP_STATUS_ERROR_</code> value if an error occurred.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONNew">cupsJSONNew</a></h3>
+<p class="description">Create a new JSON node.</p>
+<p class="code">
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONNew(<a href="#cups_json_t">cups_json_t</a> *parent, <a href="#cups_json_t">cups_json_t</a> *after, <a href="#cups_jtype_t">cups_jtype_t</a> type);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>parent</th>
+<td class="description">Parent JSON node or <code>NULL</code> for a root node</td></tr>
+<tr><th>after</th>
+<td class="description">Previous sibling node or <code>NULL</code> to append to the end</td></tr>
+<tr><th>type</th>
+<td class="description">JSON node type</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">JSON node</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONNewKey">cupsJSONNewKey</a></h3>
+<p class="description">Create a new JSON key node.</p>
+<p class="code">
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONNewKey(<a href="#cups_json_t">cups_json_t</a> *parent, <a href="#cups_json_t">cups_json_t</a> *after, const char *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>parent</th>
+<td class="description">Parent JSON node or <code>NULL</code> for a root node</td></tr>
+<tr><th>after</th>
+<td class="description">Previous sibling node or <code>NULL</code> to append to the end</td></tr>
+<tr><th>value</th>
+<td class="description">Key string</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">JSON node</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONNewNumber">cupsJSONNewNumber</a></h3>
+<p class="description">Create a new JSON number node.</p>
+<p class="code">
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONNewNumber(<a href="#cups_json_t">cups_json_t</a> *parent, <a href="#cups_json_t">cups_json_t</a> *after, double value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>parent</th>
+<td class="description">Parent JSON node or <code>NULL</code> for a root node</td></tr>
+<tr><th>after</th>
+<td class="description">Previous sibling node or <code>NULL</code> to append to the end</td></tr>
+<tr><th>value</th>
+<td class="description">Number value</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">JSON node</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJSONNewString">cupsJSONNewString</a></h3>
+<p class="description">Create a new JSON string node.</p>
+<p class="code">
+<a href="#cups_json_t">cups_json_t</a> *cupsJSONNewString(<a href="#cups_json_t">cups_json_t</a> *parent, <a href="#cups_json_t">cups_json_t</a> *after, const char *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>parent</th>
+<td class="description">Parent JSON node or <code>NULL</code> for a root node</td></tr>
+<tr><th>after</th>
+<td class="description">Previous sibling node or <code>NULL</code> to append to the end</td></tr>
+<tr><th>value</th>
+<td class="description">String value</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Default attribute or <code>NULL</code> for none</p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
-<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
-<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
-<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
-functions to inspect the default value(s) as needed.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsFinishDestDocument">cupsFinishDestDocument</a></h3>
-<p class="description">Finish the current document.</p>
+<p class="description">JSON node</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTDelete">cupsJWTDelete</a></h3>
+<p class="description">Free the memory used for a JSON Web Token.</p>
 <p class="code">
-ipp_status_t cupsFinishDestDocument(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *info);</p>
+void cupsJWTDelete(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>info</th>
-<td class="description">Destination information</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTExportString">cupsJWTExportString</a></h3>
+<p class="description">Export a JWT with the JWS Compact or JWS JSON (Flattened) Serialization format.</p>
+<p class="code">
+char *cupsJWTExportString(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, <a href="#cups_jws_format_t">cups_jws_format_t</a> format);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>format</th>
+<td class="description">JWS serialization format</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of document submission</p>
+<p class="description">JWT/JWS Serialization string</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Returns <code>IPP_STATUS_OK</code> or <code>IPP_STATUS_OK_SUBST</code> on success.
+<p class="discussion">This function exports a JWT to a JWS Compact or JWS JSON Serialization
+string.  The JSON output is always the &quot;flattened&quot; format since the JWT
+only contains a single signature.<br>
+<br>
+The return value must be freed using the <code>free</code> function.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsFreeDestInfo">cupsFreeDestInfo</a></h3>
-<p class="description">Free destination information obtained using
-<a href="#cupsCopyDestInfo"><code>cupsCopyDestInfo</code></a>.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetAlgorithm">cupsJWTGetAlgorithm</a></h3>
+<p class="description">Get the signature algorithm used by a JSON Web Token.</p>
 <p class="code">
-void cupsFreeDestInfo(<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo);</p>
+<a href="#cups_jwa_t">cups_jwa_t</a> cupsJWTGetAlgorithm(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
 </tbody></table>
-<h3 class="function"><a id="cupsFreeDests">cupsFreeDests</a></h3>
-<p class="description">Free the memory used by the list of destinations.</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Signature algorithm</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetClaimNumber">cupsJWTGetClaimNumber</a></h3>
+<p class="description">Get the number value of a claim.</p>
 <p class="code">
-void cupsFreeDests(int num_dests, <a href="#cups_dest_t">cups_dest_t</a> *dests);</p>
+double cupsJWTGetClaimNumber(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *claim);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>num_dests</th>
-<td class="description">Number of destinations</td></tr>
-<tr><th>dests</th>
-<td class="description">Destinations</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>claim</th>
+<td class="description">Claim name</td></tr>
 </tbody></table>
-<h3 class="function"><a id="cupsFreeJobs">cupsFreeJobs</a></h3>
-<p class="description">Free memory used by job data.</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number value</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetClaimString">cupsJWTGetClaimString</a></h3>
+<p class="description">Get the string value of a claim.</p>
 <p class="code">
-void cupsFreeJobs(int num_jobs, <a href="#cups_job_t">cups_job_t</a> *jobs);</p>
+const char *cupsJWTGetClaimString(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *claim);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>num_jobs</th>
-<td class="description">Number of jobs</td></tr>
-<tr><th>jobs</th>
-<td class="description">Jobs</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>claim</th>
+<td class="description">Claim name</td></tr>
 </tbody></table>
-<h3 class="function"><a id="cupsFreeOptions">cupsFreeOptions</a></h3>
-<p class="description">Free all memory used by options.</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">String value</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetClaimType">cupsJWTGetClaimType</a></h3>
+<p class="description">Get the value type of a claim.</p>
 <p class="code">
-void cupsFreeOptions(int num_options, <a href="#cups_option_t">cups_option_t</a> *options);</p>
+<a href="#cups_jtype_t">cups_jtype_t</a> cupsJWTGetClaimType(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *claim);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>num_options</th>
-<td class="description">Number of options</td></tr>
-<tr><th>options</th>
-<td class="description">Pointer to options</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>claim</th>
+<td class="description">Claim name</td></tr>
 </tbody></table>
-<h3 class="function"><a id="cupsGetDest">cupsGetDest</a></h3>
-<p class="description">Get the named destination from the list.</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">JSON value type</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetClaimValue">cupsJWTGetClaimValue</a></h3>
+<p class="description">Get the value node of a claim.</p>
 <p class="code">
-<a href="#cups_dest_t">cups_dest_t</a> *cupsGetDest(const char *name, const char *instance, int num_dests, <a href="#cups_dest_t">cups_dest_t</a> *dests);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJWTGetClaimValue(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *claim);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>name</th>
-<td class="description">Destination name or <code>NULL</code> for the default destination</td></tr>
-<tr><th>instance</th>
-<td class="description">Instance name or <code>NULL</code></td></tr>
-<tr><th>num_dests</th>
-<td class="description">Number of destinations</td></tr>
-<tr><th>dests</th>
-<td class="description">Destinations</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>claim</th>
+<td class="description">Claim name</td></tr>
 </tbody></table>
 <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="#cupsEnumDests"><code>cupsEnumDests</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"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsGetDestMediaByIndex">cupsGetDestMediaByIndex</a></h3>
-<p class="description">Get a media name, dimension, and margins for a
-specific size.</p>
+<p class="description">JSON value node</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetClaims">cupsJWTGetClaims</a></h3>
+<p class="description">Get the JWT claims as a JSON object.</p>
 <p class="code">
-int cupsGetDestMediaByIndex(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, int n, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJWTGetClaims(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
-<tr><th>n</th>
-<td class="description">Media size number (0-based)</td></tr>
-<tr><th>flags</th>
-<td class="description">Media flags</td></tr>
-<tr><th>size</th>
-<td class="description">Media size information</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
 </tbody></table>
 <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 <code>flags</code> parameter determines which set of media are indexed.  For
-example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will get the Nth
-borderless size supported by the printer.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsGetDestMediaByName">cupsGetDestMediaByName</a></h3>
-<p class="description">Get media names, dimensions, and margins.</p>
+<p class="description">JSON object</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetHeaderNumber">cupsJWTGetHeaderNumber</a></h3>
+<p class="description">Get the number value of a protected header.</p>
 <p class="code">
-int cupsGetDestMediaByName(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *media, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
+double cupsJWTGetHeaderNumber(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *header);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
-<tr><th>media</th>
-<td class="description">Media name</td></tr>
-<tr><th>flags</th>
-<td class="description">Media matching flags</td></tr>
-<tr><th>size</th>
-<td class="description">Media size information</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>header</th>
+<td class="description">Header name</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">1 on match, 0 on failure</p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">The &quot;media&quot; string is a PWG media name.  &quot;Flags&quot; provides some matching
-guidance (multiple flags can be combined):<br>
-<br>
-CUPS_MEDIA_FLAGS_DEFAULT    = find the closest size supported by the printer,
-CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size,
-CUPS_MEDIA_FLAGS_DUPLEX     = find a size compatible with 2-sided printing,
-CUPS_MEDIA_FLAGS_EXACT      = find an exact match for the size, and
-CUPS_MEDIA_FLAGS_READY      = if the printer supports media sensing, find the
-size amongst the &quot;ready&quot; media.<br>
-<br>
-The matching result (if any) is returned in the &quot;cups_size_t&quot; structure.<br>
-<br>
-Returns 1 when there is a match and 0 if there is not a match.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsGetDestMediaBySize">cupsGetDestMediaBySize</a></h3>
-<p class="description">Get media names, dimensions, and margins.</p>
+<p class="description">Number value</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetHeaderString">cupsJWTGetHeaderString</a></h3>
+<p class="description">Get the string value of a protected header.</p>
 <p class="code">
-int cupsGetDestMediaBySize(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, int width, int length, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
+const char *cupsJWTGetHeaderString(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *header);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
-<tr><th>width</th>
-<td class="description">Media width in hundredths of
-of millimeters</td></tr>
-<tr><th>length</th>
-<td class="description">Media length in hundredths of
-of millimeters</td></tr>
-<tr><th>flags</th>
-<td class="description">Media matching flags</td></tr>
-<tr><th>size</th>
-<td class="description">Media size information</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>header</th>
+<td class="description">Header name</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">1 on match, 0 on failure</p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">&quot;Width&quot; and &quot;length&quot; are the dimensions in hundredths of millimeters.
-&quot;Flags&quot; provides some matching guidance (multiple flags can be combined):<br>
-<br>
-CUPS_MEDIA_FLAGS_DEFAULT    = find the closest size supported by the printer,
-CUPS_MEDIA_FLAGS_BORDERLESS = find a borderless size,
-CUPS_MEDIA_FLAGS_DUPLEX     = find a size compatible with 2-sided printing,
-CUPS_MEDIA_FLAGS_EXACT      = find an exact match for the size, and
-CUPS_MEDIA_FLAGS_READY      = if the printer supports media sensing, find the
-size amongst the &quot;ready&quot; media.<br>
-<br>
-The matching result (if any) is returned in the &quot;cups_size_t&quot; structure.<br>
-<br>
-Returns 1 when there is a match and 0 if there is not a match.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsGetDestMediaCount">cupsGetDestMediaCount</a></h3>
-<p class="description">Get the number of sizes supported by a
-destination.</p>
+<p class="description">String value</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetHeaderType">cupsJWTGetHeaderType</a></h3>
+<p class="description">Get the value type of a protected header.</p>
 <p class="code">
-int cupsGetDestMediaCount(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, unsigned flags);</p>
+<a href="#cups_jtype_t">cups_jtype_t</a> cupsJWTGetHeaderType(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *header);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
-<tr><th>flags</th>
-<td class="description">Media flags</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>header</th>
+<td class="description">Header name</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of sizes</p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>flags</code> parameter determines the set of media sizes that are
-counted.  For example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return
-the number of borderless sizes.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsGetDestMediaDefault">cupsGetDestMediaDefault</a></h3>
-<p class="description">Get the default size for a destination.</p>
+<p class="description">JSON value type</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetHeaderValue">cupsJWTGetHeaderValue</a></h3>
+<p class="description">Get the value node of a protected header.</p>
 <p class="code">
-int cupsGetDestMediaDefault(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJWTGetHeaderValue(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *header);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to destination</td></tr>
-<tr><th>dest</th>
-<td class="description">Destination</td></tr>
-<tr><th>dinfo</th>
-<td class="description">Destination information</td></tr>
-<tr><th>flags</th>
-<td class="description">Media flags</td></tr>
-<tr><th>size</th>
-<td class="description">Media size information</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>header</th>
+<td class="description">Header name</td></tr>
 </tbody></table>
 <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 <code>flags</code> parameter determines which default size is returned.  For
-example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return the default
-borderless size, typically US Letter or A4, but sometimes 4x6 photo media.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="cupsGetDestWithURI">cupsGetDestWithURI</a></h3>
-<p class="description">Get a destination associated with a URI.</p>
+<p class="description">JSON value node</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTGetHeaders">cupsJWTGetHeaders</a></h3>
+<p class="description">Get the JWT protected headers as a JSON object.</p>
 <p class="code">
-<a href="#cups_dest_t">cups_dest_t</a> *cupsGetDestWithURI(const char *name, const char *uri);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJWTGetHeaders(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>name</th>
-<td class="description">Desired printer name or <code>NULL</code></td></tr>
-<tr><th>uri</th>
-<td class="description">URI for the printer</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Destination or <code>NULL</code></p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">&quot;name&quot; is the desired name for the printer. If <code>NULL</code>, a name will be
-created using the URI.<br>
-<br>
-&quot;uri&quot; is the &quot;ipp&quot; or &quot;ipps&quot; URI for the printer.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.1.21/macOS 10.4&#160;</span><a id="cupsGetDests2">cupsGetDests2</a></h3>
-<p class="description">Get the list of destinations from the specified server.</p>
+<p class="description">JSON object</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTHasValidSignature">cupsJWTHasValidSignature</a></h3>
+<p class="description">Determine whether the JWT has a valid signature.</p>
 <p class="code">
-int cupsGetDests2(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> **dests);</p>
+bool cupsJWTHasValidSignature(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, <a href="#cups_json_t">cups_json_t</a> *jwk);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
-<tr><th>dests</th>
-<td class="description">Destinations</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>jwk</th>
+<td class="description">JWK key set</td></tr>
 </tbody></table>
 <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
-&quot;printer-info&quot;, &quot;printer-is-accepting-jobs&quot;, &quot;printer-is-shared&quot;,
-&quot;printer-make-and-model&quot;, &quot;printer-state&quot;, &quot;printer-state-change-time&quot;,
-&quot;printer-state-reasons&quot;, &quot;printer-type&quot;, and &quot;printer-uri-supported&quot;
-attributes as options.<br>
-<br>
-CUPS 1.4 adds the &quot;marker-change-time&quot;, &quot;marker-colors&quot;,
-&quot;marker-high-levels&quot;, &quot;marker-levels&quot;, &quot;marker-low-levels&quot;, &quot;marker-message&quot;,
-&quot;marker-names&quot;, &quot;marker-types&quot;, and &quot;printer-commands&quot; attributes as options.<br>
-<br>
-CUPS 2.2 adds accessible IPP printers to the list of destinations that can
-be used.  The &quot;printer-uri-supported&quot; option will be present for those IPP
-printers that have been recently used.<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">&#160;CUPS 2.2.4/macOS 10.13&#160;</span><a id="cupsGetIntegerOption">cupsGetIntegerOption</a></h3>
-<p class="description">Get an integer option value.</p>
+<p class="description"><code>true</code> if value, <code>false</code> otherwise</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTImportString">cupsJWTImportString</a></h3>
+<p class="description">Import a JSON Web Token or JSON Web Signature.</p>
 <p class="code">
-int cupsGetIntegerOption(const char *name, int num_options, <a href="#cups_option_t">cups_option_t</a> *options);</p>
+<a href="#cups_jwt_t">cups_jwt_t</a> *cupsJWTImportString(const char *s, <a href="#cups_jws_format_t">cups_jws_format_t</a> format);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>name</th>
-<td class="description">Name of option</td></tr>
-<tr><th>num_options</th>
-<td class="description">Number of options</td></tr>
-<tr><th>options</th>
-<td class="description">Options</td></tr>
+<tr><th>s</th>
+<td class="description">JWS string</td></tr>
+<tr><th>format</th>
+<td class="description">JWS serialization format</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Option value or <code>INT_MIN</code></p>
-<h4 class="discussion">Discussion</h4>
-<p class="discussion">INT_MIN is returned when the option does not exist, is not an integer, or
-exceeds the range of values for the &quot;int&quot; type.
-
-</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.1.21/macOS 10.4&#160;</span><a id="cupsGetJobs2">cupsGetJobs2</a></h3>
-<p class="description">Get the jobs from the specified server.</p>
+<p class="description">JWT object</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTMakePrivateKey">cupsJWTMakePrivateKey</a></h3>
+<p class="description">Make a JSON Web Key for encryption and signing.</p>
 <p class="code">
-int cupsGetJobs2(<a href="#http_t">http_t</a> *http, <a href="#cups_job_t">cups_job_t</a> **jobs, const char *name, int myjobs, int whichjobs);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJWTMakePrivateKey(<a href="#cups_jwa_t">cups_jwa_t</a> alg);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
-<tr><th>jobs</th>
-<td class="description">Job data</td></tr>
-<tr><th>name</th>
-<td class="description"><code>NULL</code> = all destinations, otherwise show jobs for named destination</td></tr>
-<tr><th>myjobs</th>
-<td class="description">0 = all users, 1 = mine</td></tr>
-<tr><th>whichjobs</th>
-<td class="description"><code>CUPS_WHICHJOBS_ALL</code>, <code>CUPS_WHICHJOBS_ACTIVE</code>, or <code>CUPS_WHICHJOBS_COMPLETED</code></td></tr>
+<tr><th>alg</th>
+<td class="description">Signing/encryption algorithm</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of jobs</p>
+<p class="description">Private JSON Web Key or <code>NULL</code> on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">A &quot;whichjobs&quot; 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 class="discussion">This function makes a JSON Web Key (JWK) for the specified JWS/JWE algorithm
+for use when signing or encrypting JSON Web Tokens.  The resulting JWK
+<em>must not</em> be provided to clients - instead, call <a href="#cupsJWTMakePublicKey"><code>cupsJWTMakePublicKey</code></a>
+to produce a public key subset suitable for verification and decryption.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsGetNamedDest">cupsGetNamedDest</a></h3>
-<p class="description">Get options for the named destination.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTMakePublicKey">cupsJWTMakePublicKey</a></h3>
+<p class="description">Make a JSON Web Key for decryption and verification.</p>
 <p class="code">
-<a href="#cups_dest_t">cups_dest_t</a> *cupsGetNamedDest(<a href="#http_t">http_t</a> *http, const char *name, const char *instance);</p>
+<a href="#cups_json_t">cups_json_t</a> *cupsJWTMakePublicKey(<a href="#cups_json_t">cups_json_t</a> *jwk);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
-<tr><th>name</th>
-<td class="description">Destination name or <code>NULL</code> for the default destination</td></tr>
-<tr><th>instance</th>
-<td class="description">Instance name or <code>NULL</code></td></tr>
+<tr><th>jwk</th>
+<td class="description">Private JSON Web Key</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Destination or <code>NULL</code></p>
+<p class="description">Public JSON Web Key or <code>NULL</code> on error</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="#cupsGetDests2"><code>cupsGetDests2</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 &quot;http&quot; is <code>CUPS_HTTP_DEFAULT</code>, the connection to the default print
-server will be used.<br>
-<br>
-If &quot;name&quot; 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
-&quot;num_dests&quot; value of 1.
+<p class="discussion">This function makes a public JSON Web Key (JWK) from the specified private
+JWK suitable for use when decrypting or verifying a JWE/JWS message.
 
 </p>
-<h3 class="function"><a id="cupsGetOption">cupsGetOption</a></h3>
-<p class="description">Get an option value.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTNew">cupsJWTNew</a></h3>
+<p class="description">Create a new, empty JSON Web Token.</p>
 <p class="code">
-const char *cupsGetOption(const char *name, int num_options, <a href="#cups_option_t">cups_option_t</a> *options);</p>
+<a href="#cups_jwt_t">cups_jwt_t</a> *cupsJWTNew(const char *type);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>name</th>
-<td class="description">Name of option</td></tr>
-<tr><th>num_options</th>
-<td class="description">Number of options</td></tr>
-<tr><th>options</th>
-<td class="description">Options</td></tr>
+<tr><th>type</th>
+<td class="description">JWT type or <code>NULL</code> for default (&quot;JWT&quot;)</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Option value or <code>NULL</code></p>
-<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsGetPassword2">cupsGetPassword2</a></h3>
-<p class="description">Get a password from the user using the current
-password callback.</p>
+<p class="description">JWT object</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTSetClaimNumber">cupsJWTSetClaimNumber</a></h3>
+<p class="description">Set a claim number.</p>
 <p class="code">
-const char *cupsGetPassword2(const char *prompt, <a href="#http_t">http_t</a> *http, const char *method, const char *resource);</p>
+void cupsJWTSetClaimNumber(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *claim, double value);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>prompt</th>
-<td class="description">Prompt string</td></tr>
-<tr><th>http</th>
-<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
-<tr><th>method</th>
-<td class="description">Request method (&quot;GET&quot;, &quot;POST&quot;, &quot;PUT&quot;)</td></tr>
-<tr><th>resource</th>
-<td class="description">Resource path</td></tr>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>claim</th>
+<td class="description">Claim name</td></tr>
+<tr><th>value</th>
+<td class="description">Number value</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTSetClaimString">cupsJWTSetClaimString</a></h3>
+<p class="description">Set a claim string.</p>
+<p class="code">
+void cupsJWTSetClaimString(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *claim, const char *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>claim</th>
+<td class="description">Claim name</td></tr>
+<tr><th>value</th>
+<td class="description">String value</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTSetClaimValue">cupsJWTSetClaimValue</a></h3>
+<p class="description">Set a claim value.</p>
+<p class="code">
+void cupsJWTSetClaimValue(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *claim, <a href="#cups_json_t">cups_json_t</a> *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>claim</th>
+<td class="description">Claim name</td></tr>
+<tr><th>value</th>
+<td class="description">JSON value node</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTSetHeaderNumber">cupsJWTSetHeaderNumber</a></h3>
+<p class="description">Set a protected header number.</p>
+<p class="code">
+void cupsJWTSetHeaderNumber(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *header, double value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>header</th>
+<td class="description">Header name</td></tr>
+<tr><th>value</th>
+<td class="description">Number value</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTSetHeaderString">cupsJWTSetHeaderString</a></h3>
+<p class="description">Set a protected header string.</p>
+<p class="code">
+void cupsJWTSetHeaderString(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *header, const char *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>header</th>
+<td class="description">Header name</td></tr>
+<tr><th>value</th>
+<td class="description">String value</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTSetHeaderValue">cupsJWTSetHeaderValue</a></h3>
+<p class="description">Set a protected header value.</p>
+<p class="code">
+void cupsJWTSetHeaderValue(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, const char *header, <a href="#cups_json_t">cups_json_t</a> *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>header</th>
+<td class="description">Header name</td></tr>
+<tr><th>value</th>
+<td class="description">JSON value node</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsJWTSign">cupsJWTSign</a></h3>
+<p class="description">Sign a JSON Web Token, creating a JSON Web Signature.</p>
+<p class="code">
+bool cupsJWTSign(<a href="#cups_jwt_t">cups_jwt_t</a> *jwt, <a href="#cups_jwa_t">cups_jwa_t</a> alg, <a href="#cups_json_t">cups_json_t</a> *jwk);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>jwt</th>
+<td class="description">JWT object</td></tr>
+<tr><th>alg</th>
+<td class="description">Signing algorithm</td></tr>
+<tr><th>jwk</th>
+<td class="description">JWK key set</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Password</p>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h3 class="function"><a id="cupsLangDefault">cupsLangDefault</a></h3>
+<p class="description">Return the default language.</p>
+<p class="code">
+<a href="#cups_lang_t">cups_lang_t</a> *cupsLangDefault(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Language data</p>
+<h3 class="function"><a id="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(<a href="#cups_lang_t">cups_lang_t</a> *lang);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>lang</th>
+<td class="description">Language data</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Character encoding</p>
+<h3 class="function"><a id="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 id="cupsLangFree">cupsLangFree</a></h3>
+<p class="description">Free language data.</p>
+<p class="code">
+void cupsLangFree(<a href="#cups_lang_t">cups_lang_t</a> *lang);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>lang</th>
+<td class="description">Language to free</td></tr>
+</tbody></table>
 <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="#cupsSetPasswordCB2"><code>cupsSetPasswordCB2</code></a> function need to do so in each thread for the
-same function to be used.
-
-</p>
+<p class="discussion">This does not actually free anything; use <a href="#cupsLangFlush"><code>cupsLangFlush</code></a> for that.</p>
+<h3 class="function"><a id="cupsLangGet">cupsLangGet</a></h3>
+<p class="description">Get a language.</p>
+<p class="code">
+<a href="#cups_lang_t">cups_lang_t</a> *cupsLangGet(const char *language);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>language</th>
+<td class="description">Language or locale</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Language data</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsLastError">cupsLastError</a></h3>
+<p class="description">Return the last IPP status code received on the current thread.</p>
+<p class="code">
+ipp_status_t cupsLastError(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">IPP status code from last request</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsLastErrorString">cupsLastErrorString</a></h3>
+<p class="description">Return the last IPP status-message received on the current thread.</p>
+<p class="code">
+const char *cupsLastErrorString(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">status-message text from last request</p>
 <h3 class="function"><span class="info">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="cupsLocalizeDestMedia">cupsLocalizeDestMedia</a></h3>
 <p class="description">Get the localized string for a destination media
-size.</p>
+                            size.</p>
 <p class="code">
 const char *cupsLocalizeDestMedia(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, unsigned flags, <a href="#cups_size_t">cups_size_t</a> *size);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3145,7 +5439,7 @@ invalid if the destination information is deleted.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsLocalizeDestOption">cupsLocalizeDestOption</a></h3>
 <p class="description">Get the localized string for a destination
-option.</p>
+                             option.</p>
 <p class="code">
 const char *cupsLocalizeDestOption(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3168,7 +5462,7 @@ invalid if the destination information is deleted.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsLocalizeDestValue">cupsLocalizeDestValue</a></h3>
 <p class="description">Get the localized string for a destination
-option+value pair.</p>
+                            option+value pair.</p>
 <p class="code">
 const char *cupsLocalizeDestValue(<a href="#http_t">http_t</a> *http, <a href="#cups_dest_t">cups_dest_t</a> *dest, <a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo, const char *option, const char *value);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3191,25 +5485,76 @@ const char *cupsLocalizeDestValue(<a href="#http_t">http_t</a> *http, <a href="#
 invalid if the destination information is deleted.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="cupsMakeServerCredentials">cupsMakeServerCredentials</a></h3>
-<p class="description">Make a self-signed certificate and private key pair.</p>
+<h3 class="function"><a id="cupsMutexDestroy">cupsMutexDestroy</a></h3>
+<p class="description">Destroy a mutex.</p>
 <p class="code">
-int cupsMakeServerCredentials(const char *path, const char *common_name, int num_alt_names, const char **alt_names, time_t expiration_date);</p>
+void cupsMutexDestroy(<a href="#cups_mutex_t">cups_mutex_t</a> *mutex);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>path</th>
-<td class="description">Keychain path or <code>NULL</code> for default</td></tr>
-<tr><th>common_name</th>
-<td class="description">Common name</td></tr>
-<tr><th>num_alt_names</th>
-<td class="description">Number of subject alternate names</td></tr>
-<tr><th>alt_names</th>
-<td class="description">Subject Alternate Names</td></tr>
-<tr><th>expiration_date</th>
-<td class="description">Expiration date</td></tr>
+<tr><th>mutex</th>
+<td class="description">Mutex</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsMutexInit">cupsMutexInit</a></h3>
+<p class="description">Initialize a mutex.</p>
+<p class="code">
+void cupsMutexInit(<a href="#cups_mutex_t">cups_mutex_t</a> *mutex);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>mutex</th>
+<td class="description">Mutex</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsMutexLock">cupsMutexLock</a></h3>
+<p class="description">Lock a mutex.</p>
+<p class="code">
+void cupsMutexLock(<a href="#cups_mutex_t">cups_mutex_t</a> *mutex);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>mutex</th>
+<td class="description">Mutex</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsMutexUnlock">cupsMutexUnlock</a></h3>
+<p class="description">Unlock a mutex.</p>
+<p class="code">
+void cupsMutexUnlock(<a href="#cups_mutex_t">cups_mutex_t</a> *mutex);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>mutex</th>
+<td class="description">Mutex</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsNotifySubject">cupsNotifySubject</a></h3>
+<p class="description">Return the subject for the given notification message.</p>
+<p class="code">
+char *cupsNotifySubject(<a href="#cups_lang_t">cups_lang_t</a> *lang, <a href="#ipp_t">ipp_t</a> *event);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>lang</th>
+<td class="description">Language data</td></tr>
+<tr><th>event</th>
+<td class="description">Event data</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">1 on success, 0 on failure</p>
+<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">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsNotifyText">cupsNotifyText</a></h3>
+<p class="description">Return the text for the given notification message.</p>
+<p class="code">
+char *cupsNotifyText(<a href="#cups_lang_t">cups_lang_t</a> *lang, <a href="#ipp_t">ipp_t</a> *event);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>lang</th>
+<td class="description">Language data</td></tr>
+<tr><th>event</th>
+<td class="description">Event data</td></tr>
+</tbody></table>
+<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 id="cupsParseOptions">cupsParseOptions</a></h3>
 <p class="description">Parse options from a command-line argument.</p>
 <p class="code">
@@ -3231,6 +5576,91 @@ to the PAPI text option ABNF specification. Collection values
 (&quot;name={a=... b=... c=...}&quot;) are stored with the curley brackets
 intact - use <code>cupsParseOptions</code> on the value to extract the
 collection attributes.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.1.20/macOS 10.4&#160;</span><a id="cupsPutFd">cupsPutFd</a></h3>
+<p class="description">Put a file on the server.</p>
+<p class="code">
+http_status_t cupsPutFd(<a href="#http_t">http_t</a> *http, const char *resource, int fd);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>resource</th>
+<td class="description">Resource name</td></tr>
+<tr><th>fd</th>
+<td class="description">File descriptor</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">HTTP status</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns <code>HTTP_STATUS_CREATED</code> when the file is stored
+successfully.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.1.20/macOS 10.4&#160;</span><a id="cupsPutFile">cupsPutFile</a></h3>
+<p class="description">Put a file on the server.</p>
+<p class="code">
+http_status_t cupsPutFile(<a href="#http_t">http_t</a> *http, const char *resource, const char *filename);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>resource</th>
+<td class="description">Resource name</td></tr>
+<tr><th>filename</th>
+<td class="description">Filename</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">HTTP status</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns <code>HTTP_CREATED</code> when the file is stored
+successfully.
+
+</p>
+<h3 class="function"><a id="cupsRWDestroy">cupsRWDestroy</a></h3>
+<p class="description">Destroy a reader/writer lock.</p>
+<p class="code">
+void cupsRWDestroy(<a href="#cups_rwlock_t">cups_rwlock_t</a> *rwlock);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>rwlock</th>
+<td class="description">Reader/writer lock</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsRWInit">cupsRWInit</a></h3>
+<p class="description">Initialize a reader/writer lock.</p>
+<p class="code">
+void cupsRWInit(<a href="#cups_rwlock_t">cups_rwlock_t</a> *rwlock);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>rwlock</th>
+<td class="description">Reader/writer lock</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsRWLockRead">cupsRWLockRead</a></h3>
+<p class="description">Acquire a reader/writer lock for reading.</p>
+<p class="code">
+void cupsRWLockRead(<a href="#cups_rwlock_t">cups_rwlock_t</a> *rwlock);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>rwlock</th>
+<td class="description">Reader/writer lock</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsRWLockWrite">cupsRWLockWrite</a></h3>
+<p class="description">Acquire a reader/writer lock for writing.</p>
+<p class="code">
+void cupsRWLockWrite(<a href="#cups_rwlock_t">cups_rwlock_t</a> *rwlock);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>rwlock</th>
+<td class="description">Reader/writer lock</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsRWUnlock">cupsRWUnlock</a></h3>
+<p class="description">Release a reader/writer lock.</p>
+<p class="code">
+void cupsRWUnlock(<a href="#cups_rwlock_t">cups_rwlock_t</a> *rwlock);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>rwlock</th>
+<td class="description">Reader/writer lock</td></tr>
+</tbody></table>
 <h3 class="function"><a id="cupsRasterClose">cupsRasterClose</a></h3>
 <p class="description">Close a raster stream.</p>
 <p class="code">
@@ -3243,46 +5673,90 @@ void cupsRasterClose(<a href="#cups_raster_t">cups_raster_t</a> *r);</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">The file descriptor associated with the raster stream must be closed
 separately as needed.</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.3/macOS 10.5&#160;</span><a id="cupsRasterErrorString">cupsRasterErrorString</a></h3>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsRasterGetErrorString">cupsRasterGetErrorString</a></h3>
 <p class="description">Return the last error from a raster function.</p>
 <p class="code">
-const char *cupsRasterErrorString(void);</p>
+const char *cupsRasterGetErrorString(void);</p>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Last error or <code>NULL</code></p>
+<p class="description">Last error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">If there are no recent errors, <code>NULL</code> is returned.
+<p class="discussion">If there are no recent errors, NULL is returned.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 2.2/macOS 10.12&#160;</span><a id="cupsRasterInitPWGHeader">cupsRasterInitPWGHeader</a></h3>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cupsRasterInitHeader">cupsRasterInitHeader</a></h3>
 <p class="description">Initialize a page header for PWG Raster output.</p>
 <p class="code">
-int cupsRasterInitPWGHeader(<a href="#cups_page_header2_t">cups_page_header2_t</a> *h, <a href="#pwg_media_t">pwg_media_t</a> *media, const char *type, int xdpi, int ydpi, const char *sides, const char *sheet_back);</p>
+bool cupsRasterInitHeader(<a href="#cups_page_header2_t">cups_page_header2_t</a> *h, <a href="#cups_media_t">cups_media_t</a> *media, const char *optimize, <a href="#ipp_quality_t">ipp_quality_t</a> quality, const char *intent, <a href="#ipp_orient_t">ipp_orient_t</a> orientation, const char *sides, const char *type, int xdpi, int ydpi, const char *sheet_back);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>h</th>
 <td class="description">Page header</td></tr>
 <tr><th>media</th>
-<td class="description">PWG media information</td></tr>
+<td class="description">Media information</td></tr>
+<tr><th>optimize</th>
+<td class="description">IPP &quot;print-content-optimize&quot; value</td></tr>
+<tr><th>quality</th>
+<td class="description">IPP &quot;print-quality&quot; value</td></tr>
+<tr><th>intent</th>
+<td class="description">IPP &quot;print-rendering-intent&quot; value</td></tr>
+<tr><th>orientation</th>
+<td class="description">IPP &quot;orientation-requested&quot; value</td></tr>
+<tr><th>sides</th>
+<td class="description">IPP &quot;sides&quot; value</td></tr>
 <tr><th>type</th>
 <td class="description">PWG raster type string</td></tr>
 <tr><th>xdpi</th>
 <td class="description">Cross-feed direction (horizontal) resolution</td></tr>
 <tr><th>ydpi</th>
 <td class="description">Feed direction (vertical) resolution</td></tr>
-<tr><th>sides</th>
-<td class="description">IPP &quot;sides&quot; option value</td></tr>
 <tr><th>sheet_back</th>
 <td class="description">Transform for back side or <code>NULL</code> for none</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">1 on success, 0 on failure</p>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The &quot;media&quot; argument specifies the media to use.<br>
+<p class="discussion">The &quot;media&quot; argument specifies the media to use.  The &quot;optimize&quot;, &quot;quality&quot;,
+&quot;intent&quot;, &quot;orientation&quot;, and &quot;sides&quot; arguments specify additional IPP Job
+Template attribute values that are reflected in the raster header.<br>
 <br>
 The &quot;type&quot; argument specifies a &quot;pwg-raster-document-type-supported&quot; value
-that controls the color space and bit depth of the raster data.<br>
-<br>
-The &quot;xres&quot; and &quot;yres&quot; arguments specify the raster resolution in dots per
+that controls the color space and bit depth of the raster data.  Supported
+values include:
+
+</p><ul>
+<li>&quot;adobe-rgb_8&quot;: 8-bit per component (24-bit) AdobeRGB
+</li>
+<li>&quot;adobe-rgb_16&quot;: 16-bit per component (48-bit) AdobeRGB
+</li>
+<li>&quot;black_1&quot;: 1-bit black (K)
+</li>
+<li>&quot;black_8&quot;: 8-bit black (K)
+</li>
+<li>&quot;black_16&quot;: 16-bit black (K)
+</li>
+<li>&quot;cmyk_8&quot;: 8-bit per component (32-bit) CMYK
+</li>
+<li>&quot;cmyk_16&quot;: 16-bit per component (64-bit) CMYK
+</li>
+<li>&quot;device1_8&quot; to &quot;device15_8&quot;: 8-bit per component DeviceN
+</li>
+<li>&quot;device1_16&quot; to &quot;device15_16&quot;: 16-bit per component DeviceN
+</li>
+<li>&quot;rgb_8&quot;: 8-bit per component (24-bit) DeviceRGB
+</li>
+<li>&quot;rgb_16&quot;: 16-bit per component (32-bit) DeviceRGB
+</li>
+<li>&quot;sgray_1&quot;: 1-bit sGray
+</li>
+<li>&quot;sgray_8&quot;: 8-bit sGray
+</li>
+<li>&quot;sgray_16&quot;: 16-bit sGray
+</li>
+<li>&quot;srgb_8&quot;: 8-bit per component (24-bit) sRGB
+</li>
+<li>&quot;srgb_16&quot;: 16-bit per component (48-bit) sRGB</li>
+</ul>
+<p class="discussion">The &quot;xres&quot; and &quot;yres&quot; arguments specify the raster resolution in dots per
 inch.<br>
 <br>
 The &quot;sheet_back&quot; argument specifies a &quot;pwg-raster-document-sheet-back&quot; value
@@ -3292,7 +5766,7 @@ to apply for the back side of a page.  Pass <code>NULL</code> for the front side
 <h3 class="function"><a id="cupsRasterOpen">cupsRasterOpen</a></h3>
 <p class="description">Open a raster stream using a file descriptor.</p>
 <p class="code">
-<a href="#cups_raster_t">cups_raster_t</a> *cupsRasterOpen(int fd, <a href="#cups_mode_t">cups_mode_t</a> mode);</p>
+<a href="#cups_raster_t">cups_raster_t</a> *cupsRasterOpen(int fd, cups_mode_t mode);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>fd</th>
@@ -3318,7 +5792,7 @@ be used - compressed and PWG output is generally 25-50% smaller but adds a
 <h3 class="function"><a id="cupsRasterOpenIO">cupsRasterOpenIO</a></h3>
 <p class="description">Open a raster stream using a callback function.</p>
 <p class="code">
-<a href="#cups_raster_t">cups_raster_t</a> *cupsRasterOpenIO(<a href="#cups_raster_iocb_t">cups_raster_iocb_t</a> iocb, void *ctx, <a href="#cups_mode_t">cups_mode_t</a> mode);</p>
+<a href="#cups_raster_t">cups_raster_t</a> *cupsRasterOpenIO(<a href="#cups_raster_cb_t">cups_raster_cb_t</a> iocb, void *ctx, <a href="#cups_raster_mode_t">cups_raster_mode_t</a> mode);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>iocb</th>
@@ -3343,7 +5817,7 @@ be used - compressed and PWG output is generally 25-50% smaller but adds a
 100-300% execution time overhead.</p>
 <h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsRasterReadHeader">cupsRasterReadHeader</a></h3>
 <p class="description">Read a raster page header and store it in a
-version 1 page header structure.</p>
+                           version 1 page header structure.</p>
 <p class="code">
 unsigned cupsRasterReadHeader(<a href="#cups_raster_t">cups_raster_t</a> *r, <a href="#cups_page_header_t">cups_page_header_t</a> *h);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3365,7 +5839,7 @@ page headers and copying only the version 1 data into the provided buffer.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsRasterReadHeader2">cupsRasterReadHeader2</a></h3>
 <p class="description">Read a raster page header and store it in a
-version 2 page header structure.</p>
+                            version 2 page header structure.</p>
 <p class="code">
 unsigned cupsRasterReadHeader2(<a href="#cups_raster_t">cups_raster_t</a> *r, <a href="#cups_page_header2_t">cups_page_header2_t</a> *h);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3398,7 +5872,7 @@ The &quot;cupsBytesPerLine&quot; value from the page header can be used to alloc
 the line buffer and as the number of bytes to read.</p>
 <h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsRasterWriteHeader">cupsRasterWriteHeader</a></h3>
 <p class="description">Write a raster page header from a version 1 page
-header structure.</p>
+                            header structure.</p>
 <p class="code">
 unsigned cupsRasterWriteHeader(<a href="#cups_raster_t">cups_raster_t</a> *r, <a href="#cups_page_header_t">cups_page_header_t</a> *h);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3416,7 +5890,7 @@ unsigned cupsRasterWriteHeader(<a href="#cups_raster_t">cups_raster_t</a> *r, <a
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="cupsRasterWriteHeader2">cupsRasterWriteHeader2</a></h3>
 <p class="description">Write a raster page header from a version 2
-page header structure.</p>
+                             page header structure.</p>
 <p class="code">
 unsigned cupsRasterWriteHeader2(<a href="#cups_raster_t">cups_raster_t</a> *r, <a href="#cups_page_header2_t">cups_page_header2_t</a> *h);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3451,6 +5925,27 @@ unsigned cupsRasterWritePixels(<a href="#cups_raster_t">cups_raster_t</a> *r, un
 <p class="discussion">For best performance, filters should write one or more whole lines.
 The &quot;cupsBytesPerLine&quot; value from the page header can be used to allocate
 the line buffer and as the number of bytes to write.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsReadResponseData">cupsReadResponseData</a></h3>
+<p class="description">Read additional data after the IPP response.</p>
+<p class="code">
+ssize_t cupsReadResponseData(<a href="#http_t">http_t</a> *http, char *buffer, size_t length);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>buffer</th>
+<td class="description">Buffer to use</td></tr>
+<tr><th>length</th>
+<td class="description">Number of bytes to read</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Bytes read, 0 on EOF, -1 on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function is used after <a href="#cupsGetResponse"><code>cupsGetResponse</code></a> to read the PPD or document
+files from <code>CUPS_GET_PPD</code> and <code>CUPS_GET_DOCUMENT</code> requests,
+respectively.
+
+</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.3/macOS 10.5&#160;</span><a id="cupsRemoveDest">cupsRemoveDest</a></h3>
 <p class="description">Remove a destination from the destination list.</p>
 <p class="code">
@@ -3489,8 +5984,60 @@ int cupsRemoveOption(const char *name, int num_options, <a href="#cups_option_t"
 <td class="description">Options</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">New number of options</p>
-<h3 class="function"><a id="cupsServer">cupsServer</a></h3>
+<p class="description">New number of options</p>
+<h3 class="function"><a id="cupsSaveCredentials">cupsSaveCredentials</a></h3>
+<p class="description">Save the credentials associated with a printer/server.</p>
+<p class="code">
+bool cupsSaveCredentials(const char *path, const char *common_name, const char *credentials, const char *key);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>path</th>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
+<tr><th>common_name</th>
+<td class="description">Common name for certificate</td></tr>
+<tr><th>credentials</th>
+<td class="description">PEM-encoded certificate chain</td></tr>
+<tr><th>key</th>
+<td class="description">PEM-encoded private key or <code>NULL</code> for none</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function saves the the PEM-encoded X.509 certificate chain string and
+private key (if not <code>NULL</code>) to the directory &quot;path&quot; or, if &quot;path&quot; is <code>NULL</code>,
+in a per-user or system-wide (when running as root) certificate/key store.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsSendRequest">cupsSendRequest</a></h3>
+<p class="description">Send an IPP request.</p>
+<p class="code">
+http_status_t cupsSendRequest(<a href="#http_t">http_t</a> *http, <a href="#ipp_t">ipp_t</a> *request, const char *resource, size_t length);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>request</th>
+<td class="description">IPP request</td></tr>
+<tr><th>resource</th>
+<td class="description">Resource path</td></tr>
+<tr><th>length</th>
+<td class="description">Length of data to follow or <code>CUPS_LENGTH_VARIABLE</code></td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Initial HTTP status</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Use <a href="#cupsWriteRequestData"><code>cupsWriteRequestData</code></a> to write any additional data (document, PPD
+file, etc.) for the request, <a href="#cupsGetResponse"><code>cupsGetResponse</code></a> to get the IPP response,
+and <a href="#cupsReadResponseData"><code>cupsReadResponseData</code></a> to read any additional data following the
+response. Only one request can be sent/queued at a time per <code>http_t</code>
+connection.<br>
+<br>
+Returns the initial HTTP status code, which will be <code>HTTP_STATUS_CONTINUE</code>
+on a successful send of the request.<br>
+<br>
+Note: Unlike <a href="#cupsDoFileRequest"><code>cupsDoFileRequest</code></a>, <a href="#cupsDoIORequest"><code>cupsDoIORequest</code></a>, and
+<a href="#cupsDoRequest"><code>cupsDoRequest</code></a>, the request is NOT freed with <a href="#ippDelete"><code>ippDelete</code></a>.
+
+</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsServer">cupsServer</a></h3>
 <p class="description">Return the hostname/address of the current server.</p>
 <p class="code">
 const char *cupsServer(void);</p>
@@ -3508,8 +6055,10 @@ address, or a domain socket pathname.<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">&#160;CUPS 1.5/macOS 10.7&#160;</span><a id="cupsSetClientCertCB">cupsSetClientCertCB</a></h3>
+server to be used.
+
+</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsSetClientCertCB">cupsSetClientCertCB</a></h3>
 <p class="description">Set the client certificate callback.</p>
 <p class="code">
 void cupsSetClientCertCB(<a href="#cups_client_cert_cb_t">cups_client_cert_cb_t</a> cb, void *user_data);</p>
@@ -3528,9 +6077,9 @@ 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">&#160;CUPS 1.5/macOS 10.7&#160;</span><a id="cupsSetCredentials">cupsSetCredentials</a></h3>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsSetCredentials">cupsSetCredentials</a></h3>
 <p class="description">Set the default credentials to be used for SSL/TLS
-connections.</p>
+                           connections.</p>
 <p class="code">
 int cupsSetCredentials(<a href="#cups_array_t">cups_array_t</a> *credentials);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3540,12 +6089,6 @@ int cupsSetCredentials(<a href="#cups_array_t">cups_array_t</a> *credentials);</
 </tbody></table>
 <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">&#160;CUPS 1.3/macOS 10.5&#160;</span><a id="cupsSetDefaultDest">cupsSetDefaultDest</a></h3>
 <p class="description">Set the default destination.</p>
 <p class="code">
@@ -3599,6 +6142,37 @@ environment variable, then the ~/.cups/client.conf file, and finally the
 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"><span class="info">&#160;CUPS 2.4&#160;</span><a id="cupsSetOAuthCB">cupsSetOAuthCB</a></h3>
+<p class="description">Set the OAuth 2.0 callback for CUPS.</p>
+<p class="code">
+void cupsSetOAuthCB(<a href="#cups_oauth_cb_t">cups_oauth_cb_t</a> cb, void *user_data);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>cb</th>
+<td class="description">Callback function</td></tr>
+<tr><th>user_data</th>
+<td class="description">User data pointer</td></tr>
+</tbody></table>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sets the OAuth 2.0 callback for the various CUPS APIs that
+send HTTP requests. Pass <code>NULL</code> to restore the default (console-based)
+callback.<br>
+<br>
+The OAuth callback receives the HTTP connection, realm name, scope name (if
+any), resource path, and the &quot;user_data&quot; pointer for each request that
+requires an OAuth access token. The function then returns either the Bearer
+token string or <code>NULL</code> if no authorization could be obtained.<br>
+<br>
+Beyond reusing the Bearer token for subsequent requests on the same HTTP
+connection, no caching of the token is done by the CUPS library.  The
+callback can determine whether to refresh a cached token by examining any
+existing token returned by the <a href="#httpGetAuthString"><code>httpGetAuthString</code></a> function.<br>
+<br>
+Note: The current OAuth 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">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsSetPasswordCB2">cupsSetPasswordCB2</a></h3>
 <p class="description">Set the advanced password callback for CUPS.</p>
 <p class="code">
@@ -3640,7 +6214,7 @@ default server name and port.<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">&#160;CUPS 1.5/macOS 10.7&#160;</span><a id="cupsSetServerCertCB">cupsSetServerCertCB</a></h3>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsSetServerCertCB">cupsSetServerCertCB</a></h3>
 <p class="description">Set the server certificate callback.</p>
 <p class="code">
 void cupsSetServerCertCB(<a href="#cups_server_cert_cb_t">cups_server_cert_cb_t</a> cb, void *user_data);</p>
@@ -3659,26 +6233,24 @@ 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">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="cupsSetServerCredentials">cupsSetServerCredentials</a></h3>
+<h3 class="function"><a id="cupsSetServerCredentials">cupsSetServerCredentials</a></h3>
 <p class="description">Set the default server credentials.</p>
 <p class="code">
 int cupsSetServerCredentials(const char *path, const char *common_name, int auto_create);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>path</th>
-<td class="description">Keychain path or <code>NULL</code> for default</td></tr>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
 <tr><th>common_name</th>
 <td class="description">Default common name for server</td></tr>
 <tr><th>auto_create</th>
-<td class="description">1 = automatically create self-signed certificates</td></tr>
+<td class="description"><code>true</code> = automatically create self-signed certificates</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">1 on success, 0 on failure</p>
+<p class="description"><code>1</code> on success, <code>0</code> on failure</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">Note: The server credentials are used by all threads in the running process.
-This function is threadsafe.
-
-</p>
+This function is threadsafe.</p>
 <h3 class="function"><a id="cupsSetUser">cupsSetUser</a></h3>
 <p class="description">Set the default user name.</p>
 <p class="code">
@@ -3708,6 +6280,101 @@ void cupsSetUserAgent(const char *user_agent);</p>
 version, IPP version, and operating system version and architecture.
 
 </p>
+<h3 class="function"><a id="cupsSignCredentialsRequest">cupsSignCredentialsRequest</a></h3>
+<p class="description">Sign an X.509 certificate signing request to produce an X.509 certificate chain.</p>
+<p class="code">
+bool cupsSignCredentialsRequest(const char *path, const char *common_name, const char *request, const char *root_name, <a href="#cups_credpurpose_t">cups_credpurpose_t</a> allowed_purpose, <a href="#cups_credusage_t">cups_credusage_t</a> allowed_usage, <a href="#cups_cert_san_cb_t">cups_cert_san_cb_t</a> cb, void *cb_data, time_t expiration_date);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>path</th>
+<td class="description">Directory path for certificate/key store or <code>NULL</code> for default</td></tr>
+<tr><th>common_name</th>
+<td class="description">Common name to use</td></tr>
+<tr><th>request</th>
+<td class="description">PEM-encoded CSR</td></tr>
+<tr><th>root_name</th>
+<td class="description">Root certificate</td></tr>
+<tr><th>allowed_purpose</th>
+<td class="description">Allowed credential purpose(s)</td></tr>
+<tr><th>allowed_usage</th>
+<td class="description">Allowed credential usage(s)</td></tr>
+<tr><th>cb</th>
+<td class="description">subjectAltName callback or <code>NULL</code> to allow just .local</td></tr>
+<tr><th>cb_data</th>
+<td class="description">Callback data</td></tr>
+<tr><th>expiration_date</th>
+<td class="description">Certificate expiration date</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates an X.509 certificate from a signing request.  The
+certificate is stored in the directory &quot;path&quot; or, if &quot;path&quot; is <code>NULL</code>, in a
+per-user or system-wide (when running as root) certificate/key store.  The
+generated certificate is signed by the named root certificate or, if
+&quot;root_name&quot; is <code>NULL</code>, a site-wide default root certificate.  When
+&quot;root_name&quot; is <code>NULL</code> and there is no site-wide default root certificate, a
+self-signed certificate is generated instead.<br>
+<br>
+The &quot;allowed_purpose&quot; argument specifies the allowed purpose(s) used for the
+credentials as a bitwise OR of the following constants:
+
+</p><ul>
+<li><code>CUPS_CREDPURPOSE_SERVER_AUTH</code> for validating TLS servers,
+</li>
+<li><code>CUPS_CREDPURPOSE_CLIENT_AUTH</code> for validating TLS clients,
+</li>
+<li><code>CUPS_CREDPURPOSE_CODE_SIGNING</code> for validating compiled code,
+</li>
+<li><code>CUPS_CREDPURPOSE_EMAIL_PROTECTION</code> for validating email messages,
+</li>
+<li><code>CUPS_CREDPURPOSE_TIME_STAMPING</code> for signing timestamps to objects, and/or
+</li>
+<li><code>CUPS_CREDPURPOSE_OCSP_SIGNING</code> for Online Certificate Status Protocol
+  message signing.</li>
+</ul>
+<p class="discussion">The &quot;allowed_usage&quot; argument specifies the allowed usage(s) for the
+credentials as a bitwise OR of the following constants:
+
+</p><ul>
+<li><code>CUPS_CREDUSAGE_DIGITAL_SIGNATURE</code>: digital signatures,
+</li>
+<li><code>CUPS_CREDUSAGE_NON_REPUDIATION</code>: non-repudiation/content commitment,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_ENCIPHERMENT</code>: key encipherment,
+</li>
+<li><code>CUPS_CREDUSAGE_DATA_ENCIPHERMENT</code>: data encipherment,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_AGREEMENT</code>: key agreement,
+</li>
+<li><code>CUPS_CREDUSAGE_KEY_CERT_SIGN</code>: key certicate signing,
+</li>
+<li><code>CUPS_CREDUSAGE_CRL_SIGN</code>: certificate revocation list signing,
+</li>
+<li><code>CUPS_CREDUSAGE_ENCIPHER_ONLY</code>: encipherment only,
+</li>
+<li><code>CUPS_CREDUSAGE_DECIPHER_ONLY</code>: decipherment only,
+</li>
+<li><code>CUPS_CREDUSAGE_DEFAULT_CA</code>: defaults for CA certificates,
+</li>
+<li><code>CUPS_CREDUSAGE_DEFAULT_TLS</code>: defaults for TLS certificates, and/or
+</li>
+<li><code>CUPS_CREDUSAGE_ALL</code>: all usages.</li>
+</ul>
+<p class="discussion">The &quot;cb&quot; and &quot;cb_data&quot; arguments specify a function and its data that are
+used to validate any subjectAltName values in the signing request:
+
+<pre>
+bool san_cb(const char *common_name, const char *alt_name, void *cb_data) {
+  ... return true if OK and false if not ...
+}
+</pre>
+
+If <code>NULL</code>, a default validation function is used that allows &quot;localhost&quot; and
+variations of the common name.<br>
+<br>
+The &quot;expiration_date&quot; argument specifies the expiration date and time as a
+Unix <code>time_t</code> value in seconds.</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cupsStartDestDocument">cupsStartDestDocument</a></h3>
 <p class="description">Start a new document.</p>
 <p class="code">
@@ -3744,26 +6411,223 @@ if this is the last document to be submitted in the job.  Returns
 <code>HTTP_CONTINUE</code> on success.
 
 </p>
-<h3 class="function"><a id="cupsGetUser">cupsGetUser</a></h3>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsTempFd">cupsTempFd</a></h3>
+<p class="description">Create a temporary file descriptor.</p>
+<p class="code">
+int cupsTempFd(char *filename, int len);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>filename</th>
+<td class="description">Pointer to buffer</td></tr>
+<tr><th>len</th>
+<td class="description">Size of buffer</td></tr>
+</tbody></table>
+<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">This function creates a temporary file descriptor and places the filename in
+the &quot;filename&quot; buffer.  The temporary file descriptor is opened for reading
+and writing.<br>
+<br>
+</p><blockquote>
+Note: This function is deprecated. Use the <a href="#cupsCreateTempFd"><code>cupsCreateTempFd</code></a>
+function instead.</blockquote>
+
+</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsTempFile">cupsTempFile</a></h3>
+<p class="description">Generate a temporary filename (deprecated).</p>
+<p class="code">
+char *cupsTempFile(char *filename, int len);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>filename</th>
+<td class="description">Pointer to buffer */</td></tr>
+<tr><th>len</th>
+<td class="description">Size of buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>NULL</code> (error)</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function is deprecated and no longer generates a temporary filename.
+Use <a href="#cupsCreateTempFd"><code>cupsCreateTempFd</code></a> or <a href="#cupsCreateTempFile2"><code>cupsCreateTempFile2</code></a> instead.
+
+</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsTempFile2">cupsTempFile2</a></h3>
+<p class="description">Creates a temporary CUPS file.</p>
+<p class="code">
+<a href="#cups_file_t">cups_file_t</a> *cupsTempFile2(char *filename, int len);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>filename</th>
+<td class="description">Pointer to buffer</td></tr>
+<tr><th>len</th>
+<td class="description">Size of buffer</td></tr>
+</tbody></table>
+<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">This function creates a temporary CUPS file and places the filename in the
+&quot;filename&quot; buffer.  The temporary file is opened for writing.<br>
+<br>
+</p><blockquote>
+Note: This function is deprecated. Use the <a href="#cupsCreateTempFile"><code>cupsCreateTempFile</code></a>
+function instead.</blockquote>
+
+</p>
+<h3 class="function"><a id="cupsThreadCancel">cupsThreadCancel</a></h3>
+<p class="description">Cancel (kill) a thread.</p>
+<p class="code">
+void cupsThreadCancel(<a href="#cups_thread_t">cups_thread_t</a> thread);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>thread</th>
+<td class="description">Thread ID</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsThreadCreate">cupsThreadCreate</a></h3>
+<p class="description">Create a thread.</p>
+<p class="code">
+<a href="#cups_thread_t">cups_thread_t</a> cupsThreadCreate(<a href="#cups_thread_func_t">cups_thread_func_t</a> func, void *arg);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>func</th>
+<td class="description">Entry point</td></tr>
+<tr><th>arg</th>
+<td class="description">Entry point context</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Thread ID or <code>CUPS_THREAD_INVALID</code> on failure</p>
+<h3 class="function"><a id="cupsThreadDetach">cupsThreadDetach</a></h3>
+<p class="description">Tell the OS that the thread is running independently.</p>
+<p class="code">
+void cupsThreadDetach(<a href="#cups_thread_t">cups_thread_t</a> thread);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>thread</th>
+<td class="description">Thread ID</td></tr>
+</tbody></table>
+<h3 class="function"><a id="cupsThreadWait">cupsThreadWait</a></h3>
+<p class="description">Wait for a thread to exit.</p>
+<p class="code">
+void *cupsThreadWait(<a href="#cups_thread_t">cups_thread_t</a> thread);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>thread</th>
+<td class="description">Thread ID</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Return value</p>
+<h3 class="function"><a id="cupsUTF32ToUTF8">cupsUTF32ToUTF8</a></h3>
+<p class="description">Convert UTF-32 to UTF-8.</p>
+<p class="code">
+int cupsUTF32ToUTF8(<a href="#cups_utf8_t">cups_utf8_t</a> *dest, const <a href="#cups_utf32_t">cups_utf32_t</a> *src, const int maxout);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dest</th>
+<td class="description">Target string</td></tr>
+<tr><th>src</th>
+<td class="description">Source string</td></tr>
+<tr><th>maxout</th>
+<td class="description">Max output</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Count or -1 on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">32-bit UTF-32 (actually 21-bit) maps to UTF-8 as follows...<br>
+<br>
+  UTF-32 char     UTF-8 char(s)
+  --------------------------------------------------
+         0 to 127 = 0xxxxxxx (US-ASCII)
+    128 to 2047 = 110xxxxx 10yyyyyy
+  2048 to 65535 = 1110xxxx 10yyyyyy 10zzzzzz
+          &gt; 65535 = 11110xxx 10yyyyyy 10zzzzzz 10xxxxxx<br>
+<br>
+UTF-32 prohibits chars beyond Plane 16 (&gt; 0x10ffff) in UCS-4,
+which would convert to five- or six-octet UTF-8 sequences...</p>
+<h3 class="function"><a id="cupsUTF8ToCharset">cupsUTF8ToCharset</a></h3>
+<p class="description">Convert UTF-8 to legacy character set.</p>
+<p class="code">
+int cupsUTF8ToCharset(char *dest, const <a href="#cups_utf8_t">cups_utf8_t</a> *src, const int maxout, const <a href="#cups_encoding_t">cups_encoding_t</a> encoding);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dest</th>
+<td class="description">Target string</td></tr>
+<tr><th>src</th>
+<td class="description">Source string</td></tr>
+<tr><th>maxout</th>
+<td class="description">Max output</td></tr>
+<tr><th>encoding</th>
+<td class="description">Encoding</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Count or -1 on error</p>
+<h3 class="function"><a id="cupsUTF8ToUTF32">cupsUTF8ToUTF32</a></h3>
+<p class="description">Convert UTF-8 to UTF-32.</p>
+<p class="code">
+int cupsUTF8ToUTF32(<a href="#cups_utf32_t">cups_utf32_t</a> *dest, const <a href="#cups_utf8_t">cups_utf8_t</a> *src, const int maxout);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>dest</th>
+<td class="description">Target string</td></tr>
+<tr><th>src</th>
+<td class="description">Source string</td></tr>
+<tr><th>maxout</th>
+<td class="description">Max output</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Count or -1 on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">32-bit UTF-32 (actually 21-bit) maps to UTF-8 as follows...<br>
+<br>
+  UTF-32 char     UTF-8 char(s)
+  --------------------------------------------------
+         0 to 127 = 0xxxxxxx (US-ASCII)
+    128 to 2047 = 110xxxxx 10yyyyyy
+  2048 to 65535 = 1110xxxx 10yyyyyy 10zzzzzz
+          &gt; 65535 = 11110xxx 10yyyyyy 10zzzzzz 10xxxxxx<br>
+<br>
+UTF-32 prohibits chars beyond Plane 16 (&gt; 0x10ffff) in UCS-4,
+which would convert to five- or six-octet UTF-8 sequences...</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsUser">cupsUser</a></h3>
 <p class="description">Return the current user's name.</p>
 <p class="code">
-const char *cupsGetUser(void);</p>
+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>
-<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="cupsGetUserAgent">cupsGetUserAgent</a></h3>
+name to be used.
+
+</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="cupsUserAgent">cupsUserAgent</a></h3>
 <p class="description">Return the default HTTP User-Agent string.</p>
 <p class="code">
-const char *cupsGetUserAgent(void);</p>
+const char *cupsUserAgent(void);</p>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">User-Agent string</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span><a id="cupsWriteRequestData">cupsWriteRequestData</a></h3>
+<p class="description">Write additional data after an IPP request.</p>
+<p class="code">
+http_status_t cupsWriteRequestData(<a href="#http_t">http_t</a> *http, const char *buffer, size_t length);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">Connection to server or <code>CUPS_HTTP_DEFAULT</code></td></tr>
+<tr><th>buffer</th>
+<td class="description">Bytes to write</td></tr>
+<tr><th>length</th>
+<td class="description">Number of bytes to write</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>HTTP_STATUS_CONTINUE</code> if OK or HTTP status on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function is used after <a href="#cupsSendRequest"><code>cupsSendRequest</code></a> to provide a PPD and
+after <a href="#cupsStartDocument"><code>cupsStartDocument</code></a> to provide a document file.
+
+</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpAcceptConnection">httpAcceptConnection</a></h3>
-<p class="description">Accept a new HTTP client connection from the
-specified listening socket.</p>
+<p class="description">Accept a new HTTP client connection.</p>
 <p class="code">
 <a href="#http_t">http_t</a> *httpAcceptConnection(int fd, int blocking);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3771,44 +6635,19 @@ specified listening socket.</p>
 <tr><th>fd</th>
 <td class="description">Listen socket file descriptor</td></tr>
 <tr><th>blocking</th>
-<td class="description">1 if the connection should be
-blocking, 0 otherwise</td></tr>
+<td class="description">1 if the connection should be blocking, 0 otherwise</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">HTTP connection or <code>NULL</code></p>
-<h3 class="function"><span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span><a id="httpAddCredential">httpAddCredential</a></h3>
-<p class="description">Allocates and adds a single credential to an array.</p>
-<p class="code">
-int httpAddCredential(<a href="#cups_array_t">cups_array_t</a> *credentials, const void *data, size_t datalen);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>credentials</th>
-<td class="description">Credentials array</td></tr>
-<tr><th>data</th>
-<td class="description">PEM-encoded X.509 data</td></tr>
-<tr><th>datalen</th>
-<td class="description">Length of data</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on success, -1 on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Use <code>cupsArrayNew(NULL, NULL)</code> to create a credentials array.
+<p class="discussion">This function accepts a new HTTP client connection from the specified
+listening socket &quot;fd&quot;.  The &quot;blocking&quot; argument specifies whether the new
+HTTP connection is blocking.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrAny">httpAddrAny</a></h3>
-<p class="description">Check for the &quot;any&quot; address.</p>
-<p class="code">
-int httpAddrAny(const <a href="#http_addr_t">http_addr_t</a> *addr);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>addr</th>
-<td class="description">Address to check</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">1 if &quot;any&quot;, 0 otherwise</p>
 <h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpAddrClose">httpAddrClose</a></h3>
 <p class="description">Close a socket created by <a href="#httpAddrConnect"><code>httpAddrConnect</code></a> or
-<a href="#httpAddrListen"><code>httpAddrListen</code></a>.</p>
+                    <a href="#httpAddrListen"><code>httpAddrListen</code></a>.</p>
 <p class="code">
 int httpAddrClose(<a href="#http_addr_t">http_addr_t</a> *addr, int fd);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3828,7 +6667,7 @@ ensures that domain sockets are removed when closed.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpAddrConnect2">httpAddrConnect2</a></h3>
 <p class="description">Connect to any of the addresses in the list with a
-timeout and optional cancel.</p>
+                       timeout and optional cancel.</p>
 <p class="code">
 <a href="#http_addrlist_t">http_addrlist_t</a> *httpAddrConnect2(<a href="#http_addrlist_t">http_addrlist_t</a> *addrlist, int *sock, int msec, int *cancel);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3855,23 +6694,19 @@ timeout and optional cancel.</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New address list or <code>NULL</code> on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrEqual">httpAddrEqual</a></h3>
-<p class="description">Compare two addresses.</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrFreeList">httpAddrFreeList</a></h3>
+<p class="description">Free an address list.</p>
 <p class="code">
-int httpAddrEqual(const <a href="#http_addr_t">http_addr_t</a> *addr1, const <a href="#http_addr_t">http_addr_t</a> *addr2);</p>
+void httpAddrFreeList(<a href="#http_addrlist_t">http_addrlist_t</a> *addrlist);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>addr1</th>
-<td class="description">First address</td></tr>
-<tr><th>addr2</th>
-<td class="description">Second address</td></tr>
+<tr><th>addrlist</th>
+<td class="description">Address list to free</td></tr>
 </tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">1 if equal, 0 if not</p>
-<h3 class="function"><a id="httpAddrFamily">httpAddrFamily</a></h3>
+<h3 class="function"><a id="httpAddrGetFamily">httpAddrGetFamily</a></h3>
 <p class="description">Get the address family of an address.</p>
 <p class="code">
-int httpAddrFamily(<a href="#http_addr_t">http_addr_t</a> *addr);</p>
+int httpAddrGetFamily(<a href="#http_addr_t">http_addr_t</a> *addr);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>addr</th>
@@ -3879,44 +6714,96 @@ int httpAddrFamily(<a href="#http_addr_t">http_addr_t</a> *addr);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Address family</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrFreeList">httpAddrFreeList</a></h3>
-<p class="description">Free an address list.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpAddrGetLength">httpAddrGetLength</a></h3>
+<p class="description">Return the length of the address in bytes.</p>
 <p class="code">
-void httpAddrFreeList(<a href="#http_addrlist_t">http_addrlist_t</a> *addrlist);</p>
+size_t httpAddrGetLength(const <a href="#http_addr_t">http_addr_t</a> *addr);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>addrlist</th>
-<td class="description">Address list to free</td></tr>
+<tr><th>addr</th>
+<td class="description">Address</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Length in bytes</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrGetList">httpAddrGetList</a></h3>
+<p class="description">Get a list of addresses for a hostname.</p>
+<p class="code">
+<a href="#http_addrlist_t">http_addrlist_t</a> *httpAddrGetList(const char *hostname, int family, const char *service);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>hostname</th>
+<td class="description">Hostname, IP address, or NULL for passive listen address</td></tr>
+<tr><th>family</th>
+<td class="description">Address family or AF_UNSPEC</td></tr>
+<tr><th>service</th>
+<td class="description">Service name or port number</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">List of addresses or NULL</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpAddrGetPort">httpAddrGetPort</a></h3>
+<p class="description">Get the port number associated with an address.</p>
+<p class="code">
+int httpAddrGetPort(<a href="#http_addr_t">http_addr_t</a> *addr);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>addr</th>
+<td class="description">Address</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Port number</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpAddrGetString">httpAddrGetString</a></h3>
+<p class="description">Convert an address to a numeric string.</p>
+<p class="code">
+char *httpAddrGetString(const <a href="#http_addr_t">http_addr_t</a> *addr, char *s, size_t slen);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>addr</th>
+<td class="description">Address to convert</td></tr>
+<tr><th>s</th>
+<td class="description">String buffer</td></tr>
+<tr><th>slen</th>
+<td class="description">Length of string</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Numeric address string</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpAddrIsAny">httpAddrIsAny</a></h3>
+<p class="description">Check for the &quot;any&quot; address.</p>
+<p class="code">
+bool httpAddrIsAny(const <a href="#http_addr_t">http_addr_t</a> *addr);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>addr</th>
+<td class="description">Address to check</td></tr>
 </tbody></table>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrGetList">httpAddrGetList</a></h3>
-<p class="description">Get a list of addresses for a hostname.</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> if &quot;any&quot; address, <code>false</code> otherwise</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpAddrIsEqual">httpAddrIsEqual</a></h3>
+<p class="description">Compare two addresses.</p>
 <p class="code">
-<a href="#http_addrlist_t">http_addrlist_t</a> *httpAddrGetList(const char *hostname, int family, const char *service);</p>
+bool httpAddrIsEqual(const <a href="#http_addr_t">http_addr_t</a> *addr1, const <a href="#http_addr_t">http_addr_t</a> *addr2);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>hostname</th>
-<td class="description">Hostname, IP address, or NULL for passive listen address</td></tr>
-<tr><th>family</th>
-<td class="description">Address family or AF_UNSPEC</td></tr>
-<tr><th>service</th>
-<td class="description">Service name or port number</td></tr>
+<tr><th>addr1</th>
+<td class="description">First address</td></tr>
+<tr><th>addr2</th>
+<td class="description">Second address</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">List of addresses or NULL</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrLength">httpAddrLength</a></h3>
-<p class="description">Return the length of the address in bytes.</p>
+<p class="description"><code>true</code> if equal, <code>false</code> if not</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpAddrIsLocalhost">httpAddrIsLocalhost</a></h3>
+<p class="description">Check for the local loopback address.</p>
 <p class="code">
-int httpAddrLength(const <a href="#http_addr_t">http_addr_t</a> *addr);</p>
+bool httpAddrIsLocalhost(const <a href="#http_addr_t">http_addr_t</a> *addr);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>addr</th>
-<td class="description">Address</td></tr>
+<td class="description">Address to check</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Length in bytes</p>
+<p class="description"><code>true</code> if local host, <code>false</code> otherwise</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpAddrListen">httpAddrListen</a></h3>
 <p class="description">Create a listening socket bound to the specified
-address and port.</p>
+                     address and port.</p>
 <p class="code">
 int httpAddrListen(<a href="#http_addr_t">http_addr_t</a> *addr, int port);</p>
 <h4 class="parameters">Parameters</h4>
@@ -3928,17 +6815,6 @@ int httpAddrListen(<a href="#http_addr_t">http_addr_t</a> *addr, int port);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Socket or -1 on error</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrLocalhost">httpAddrLocalhost</a></h3>
-<p class="description">Check for the local loopback address.</p>
-<p class="code">
-int httpAddrLocalhost(const <a href="#http_addr_t">http_addr_t</a> *addr);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>addr</th>
-<td class="description">Address to check</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">1 if local host, 0 otherwise</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrLookup">httpAddrLookup</a></h3>
 <p class="description">Lookup the hostname associated with the address.</p>
 <p class="code">
@@ -3954,35 +6830,20 @@ char *httpAddrLookup(const <a href="#http_addr_t">http_addr_t</a> *addr, char *n
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Host name</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpAddrPort">httpAddrPort</a></h3>
-<p class="description">Get the port number associated with an address.</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpAddrSetPort">httpAddrSetPort</a></h3>
+<p class="description">Set the port number associated with an address.</p>
 <p class="code">
-int httpAddrPort(<a href="#http_addr_t">http_addr_t</a> *addr);</p>
+void httpAddrSetPort(<a href="#http_addr_t">http_addr_t</a> *addr, int port);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>addr</th>
 <td class="description">Address</td></tr>
+<tr><th>port</th>
+<td class="description">Port</td></tr>
 </tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Port number</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAddrString">httpAddrString</a></h3>
-<p class="description">Convert an address to a numeric string.</p>
-<p class="code">
-char *httpAddrString(const <a href="#http_addr_t">http_addr_t</a> *addr, char *s, int slen);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>addr</th>
-<td class="description">Address to convert</td></tr>
-<tr><th>s</th>
-<td class="description">String buffer</td></tr>
-<tr><th>slen</th>
-<td class="description">Length of string</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Numeric address string</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAssembleURI">httpAssembleURI</a></h3>
 <p class="description">Assemble a uniform resource identifier from its
-components.</p>
+                      components.</p>
 <p class="code">
 <a href="#http_uri_status_t">http_uri_status_t</a> httpAssembleURI(<a href="#http_uri_coding_t">http_uri_coding_t</a> encoding, char *uri, int urilen, const char *scheme, const char *username, const char *host, int port, const char *resource);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4014,8 +6875,7 @@ URI string.
 
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpAssembleURIf">httpAssembleURIf</a></h3>
-<p class="description">Assemble a uniform resource identifier from its
-components with a formatted resource.</p>
+<p class="description">Assemble a uniform resource identifier from its components with a formatted resource.</p>
 <p class="code">
 <a href="#http_uri_status_t">http_uri_status_t</a> httpAssembleURIf(<a href="#http_uri_coding_t">http_uri_coding_t</a> encoding, char *uri, int urilen, const char *scheme, const char *username, const char *host, int port, const char *resourcef, ...);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4078,7 +6938,7 @@ number.  The result is formatted as a UUID URN as defined in RFC 4122.<br>
 The buffer needs to be at least 46 bytes in size.
 
 </p>
-<h3 class="function"><a id="httpBlocking">httpBlocking</a></h3>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="httpBlocking">httpBlocking</a></h3>
 <p class="description">Set blocking/non-blocking behavior on a connection.</p>
 <p class="code">
 void httpBlocking(<a href="#http_t">http_t</a> *http, int b);</p>
@@ -4089,7 +6949,7 @@ void httpBlocking(<a href="#http_t">http_t</a> *http, int b);</p>
 <tr><th>b</th>
 <td class="description">1 = blocking, 0 = non-blocking</td></tr>
 </tbody></table>
-<h3 class="function"><a id="httpCheck">httpCheck</a></h3>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="httpCheck">httpCheck</a></h3>
 <p class="description">Check to see if there is a pending response from the server.</p>
 <p class="code">
 int httpCheck(<a href="#http_t">http_t</a> *http);</p>
@@ -4110,7 +6970,7 @@ void httpClearCookie(<a href="#http_t">http_t</a> *http);</p>
 <td class="description">HTTP connection</td></tr>
 </tbody></table>
 <h3 class="function"><a id="httpClearFields">httpClearFields</a></h3>
-<p class="description">Clear HTTP request fields.</p>
+<p class="description">Clear HTTP request/response fields.</p>
 <p class="code">
 void httpClearFields(<a href="#http_t">http_t</a> *http);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4119,7 +6979,7 @@ void httpClearFields(<a href="#http_t">http_t</a> *http);</p>
 <td class="description">HTTP connection</td></tr>
 </tbody></table>
 <h3 class="function"><a id="httpClose">httpClose</a></h3>
-<p class="description">Close an HTTP connection.</p>
+<p class="description">Close a HTTP connection.</p>
 <p class="code">
 void httpClose(<a href="#http_t">http_t</a> *http);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4127,19 +6987,6 @@ void httpClose(<a href="#http_t">http_t</a> *http);</p>
 <tr><th>http</th>
 <td class="description">HTTP connection</td></tr>
 </tbody></table>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpCompareCredentials">httpCompareCredentials</a></h3>
-<p class="description">Compare two sets of X.509 credentials.</p>
-<p class="code">
-int httpCompareCredentials(<a href="#cups_array_t">cups_array_t</a> *cred1, <a href="#cups_array_t">cups_array_t</a> *cred2);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>cred1</th>
-<td class="description">First set of X.509 credentials</td></tr>
-<tr><th>cred2</th>
-<td class="description">Second set of X.509 credentials</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">1 if they match, 0 if they do not</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpConnect2">httpConnect2</a></h3>
 <p class="description">Connect to a HTTP server.</p>
 <p class="code">
@@ -4165,76 +7012,39 @@ int httpCompareCredentials(<a href="#cups_array_t">cups_array_t</a> *cred1, <a h
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New HTTP connection</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span><a id="httpCopyCredentials">httpCopyCredentials</a></h3>
-<p class="description">Copy the credentials associated with the peer in
-an encrypted connection.</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates a connection to a HTTP server.  The &quot;host&quot; and &quot;port&quot;
+arguments specify a hostname or IP address and port number to use while the
+&quot;addrlist&quot; argument specifies a list of addresses to use or <code>NULL</code> to do a
+fresh lookup.  The &quot;family&quot; argument specifies the address family to use -
+<code>AF_UNSPEC</code> to try both IPv4 and IPv6, <code>AF_INET</code> for IPv4, or <code>AF_INET6</code> for
+IPv6.<br>
+<br>
+The &quot;encryption&quot; argument specifies whether to encrypt the connection and the
+&quot;blocking&quot; argument specifies whether to use blocking behavior when reading
+or writing data.<br>
+<br>
+The &quot;msec&quot; argument specifies how long to try to connect to the server or <code>0</code>
+to just create an unconnected <code>http_t</code> object.  The &quot;cancel&quot; argument
+specifies an integer variable that can be set to a non-zero value to cancel
+the connection process.
+
+</p>
+<h3 class="function"><a id="httpCopyPeerCredentials">httpCopyPeerCredentials</a></h3>
+<p class="description">Copy the credentials associated with the peer in an encrypted connection.</p>
 <p class="code">
-int httpCopyCredentials(<a href="#http_t">http_t</a> *http, <a href="#cups_array_t">cups_array_t</a> **credentials);</p>
+char *httpCopyPeerCredentials(<a href="#http_t">http_t</a> *http);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>http</th>
 <td class="description">Connection to server</td></tr>
-<tr><th>credentials</th>
-<td class="description">Array of credentials</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="httpCredentialsAreValidForName">httpCredentialsAreValidForName</a></h3>
-<p class="description">Return whether the credentials are valid for the given name.</p>
-<p class="code">
-int httpCredentialsAreValidForName(<a href="#cups_array_t">cups_array_t</a> *credentials, const char *common_name);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>credentials</th>
-<td class="description">Credentials</td></tr>
-<tr><th>common_name</th>
-<td class="description">Name to check</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">1 if valid, 0 otherwise</p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="httpCredentialsGetExpiration">httpCredentialsGetExpiration</a></h3>
-<p class="description">Return the expiration date of the credentials.</p>
-<p class="code">
-time_t httpCredentialsGetExpiration(<a href="#cups_array_t">cups_array_t</a> *credentials);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>credentials</th>
-<td class="description">Credentials</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Expiration date of credentials</p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="httpCredentialsGetTrust">httpCredentialsGetTrust</a></h3>
-<p class="description">Return the trust of credentials.</p>
-<p class="code">
-<a href="#http_trust_t">http_trust_t</a> httpCredentialsGetTrust(<a href="#cups_array_t">cups_array_t</a> *credentials, const char *common_name);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>credentials</th>
-<td class="description">Credentials</td></tr>
-<tr><th>common_name</th>
-<td class="description">Common name for trust lookup</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Level of trust</p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="httpCredentialsString">httpCredentialsString</a></h3>
-<p class="description">Return a string representing the credentials.</p>
-<p class="code">
-size_t httpCredentialsString(<a href="#cups_array_t">cups_array_t</a> *credentials, char *buffer, size_t bufsize);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>credentials</th>
-<td class="description">Credentials</td></tr>
-<tr><th>buffer</th>
-<td class="description">Buffer or <code>NULL</code></td></tr>
-<tr><th>bufsize</th>
-<td class="description">Size of buffer</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Total size of credentials string</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.1.21/macOS 10.4&#160;</span><a id="httpDecode64_2">httpDecode64_2</a></h3>
+<p class="description">PEM-encoded X.509 certificate chain or <code>NULL</code></p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpDecode64_3">httpDecode64_3</a></h3>
 <p class="description">Base64-decode a string.</p>
 <p class="code">
-char *httpDecode64_2(char *out, int *outlen, const char *in);</p>
+char *httpDecode64_3(char *out, size_t *outlen, const char *in, const char **end);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>out</th>
@@ -4243,32 +7053,30 @@ char *httpDecode64_2(char *out, int *outlen, const char *in);</p>
 <td class="description">Size of output string</td></tr>
 <tr><th>in</th>
 <td class="description">String to read from</td></tr>
+<tr><th>end</th>
+<td class="description">Pointer to end of Base64 data (<code>NULL</code> if don't care)</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Decoded string</p>
+<p class="description">Decoded string or <code>NULL</code> on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The caller must initialize &quot;outlen&quot; to the maximum size of the decoded
-string before calling <code>httpDecode64_2</code>.  On return &quot;outlen&quot; contains the
-decoded length of the string.
+<p class="discussion">This function decodes a Base64 string as defined by RFC 4648.  The caller
+must initialize &quot;outlen&quot; to the maximum size of the decoded string.  On
+return &quot;outlen&quot; contains the decoded length of the string and &quot;end&quot; (if not
+<code>NULL</code>) points to the end of the Base64 data that has been decoded.<br>
+<br>
+This function always reserves one byte in the output buffer for a nul
+terminating character, even if the result is not a regular string.  Callers
+should ensure that the output buffer is at least one byte larger than the
+expected size, for example 33 bytes for a SHA-256 hash which is 32 bytes in
+length.<br>
+<br>
+This function supports both Base64 and Base64url strings.
 
 </p>
-<h3 class="function"><a id="httpDelete">httpDelete</a></h3>
-<p class="description">Send a DELETE request to the server.</p>
-<p class="code">
-int httpDelete(<a href="#http_t">http_t</a> *http, const char *uri);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-<tr><th>uri</th>
-<td class="description">URI to delete</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.1.21/macOS 10.4&#160;</span><a id="httpEncode64_2">httpEncode64_2</a></h3>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpEncode64_3">httpEncode64_3</a></h3>
 <p class="description">Base64-encode a string.</p>
 <p class="code">
-char *httpEncode64_2(char *out, int outlen, const char *in, int inlen);</p>
+char *httpEncode64_3(char *out, size_t outlen, const char *in, size_t inlen, bool url);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>out</th>
@@ -4279,36 +7087,19 @@ char *httpEncode64_2(char *out, int outlen, const char *in, int inlen);</p>
 <td class="description">String to read from</td></tr>
 <tr><th>inlen</th>
 <td class="description">Size of input string</td></tr>
+<tr><th>url</th>
+<td class="description"><code>true</code> for Base64url, <code>false</code> for Base64</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Encoded string</p>
-<h3 class="function"><a id="httpEncryption">httpEncryption</a></h3>
-<p class="description">Set the required encryption on the link.</p>
-<p class="code">
-int httpEncryption(<a href="#http_t">http_t</a> *http, <a href="#http_encryption_t">http_encryption_t</a> e);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-<tr><th>e</th>
-<td class="description">New encryption preference</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">-1 on error, 0 on success</p>
-<h3 class="function"><a id="httpError">httpError</a></h3>
-<p class="description">Get the last error on a connection.</p>
-<p class="code">
-int httpError(<a href="#http_t">http_t</a> *http);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Error code (errno) value</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function encodes a Base64 string as defined by RFC 4648.  The &quot;url&quot;
+parameter controls whether the original Base64 (&quot;url&quot; = <code>false</code>) or the
+Base64url (&quot;url&quot; = <code>true</code>) alphabet is used.
+
+</p>
 <h3 class="function"><a id="httpFieldValue">httpFieldValue</a></h3>
-<p class="description">Return the HTTP field enumeration value for a field
-name.</p>
+<p class="description">Return the HTTP field enumeration value for a field name.</p>
 <p class="code">
 <a href="#http_field_t">http_field_t</a> httpFieldValue(const char *name);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4338,28 +7129,6 @@ int httpFlushWrite(<a href="#http_t">http_t</a> *http);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Bytes written or -1 on error</p>
-<h3 class="function"><a id="httpFreeCredentials">httpFreeCredentials</a></h3>
-<p class="description">Free an array of credentials.</p>
-<p class="code">
-void httpFreeCredentials(<a href="#cups_array_t">cups_array_t</a> *credentials);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>credentials</th>
-<td class="description">Array of credentials</td></tr>
-</tbody></table>
-<h3 class="function"><a id="httpGet">httpGet</a></h3>
-<p class="description">Send a GET request to the server.</p>
-<p class="code">
-int httpGet(<a href="#http_t">http_t</a> *http, const char *uri);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-<tr><th>uri</th>
-<td class="description">URI to get</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
 <h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpGetActivity">httpGetActivity</a></h3>
 <p class="description">Get the most recent activity for a connection.</p>
 <p class="code">
@@ -4413,7 +7182,7 @@ string to use with <a href="#httpSetField"><code>httpSetField</code></a> for the
 
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpGetBlocking">httpGetBlocking</a></h3>
-<p class="description">Get the blocking/non-block state of a connection.</p>
+<p class="description">Get the blocking/non-blocking state of a connection.</p>
 <p class="code">
 int httpGetBlocking(<a href="#http_t">http_t</a> *http);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4425,7 +7194,7 @@ int httpGetBlocking(<a href="#http_t">http_t</a> *http);</p>
 <p class="description">1 if blocking, 0 if non-blocking</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpGetContentEncoding">httpGetContentEncoding</a></h3>
 <p class="description">Get a common content encoding, if any, between
-the client and server.</p>
+                             the client and server.</p>
 <p class="code">
 const char *httpGetContentEncoding(<a href="#http_t">http_t</a> *http);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4434,9 +7203,7 @@ const char *httpGetContentEncoding(<a href="#http_t">http_t</a> *http);</p>
 <td class="description">HTTP connection</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Content-Coding value or
-<code>NULL</code> for the identity
-coding.</p>
+<p class="description">Content-Coding value or <code>NULL</code> for the identity coding.</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">This function uses the value of the Accepts-Encoding HTTP header and must be
 called after receiving a response from the server or a request from the
@@ -4481,7 +7248,7 @@ time_t httpGetDateTime(const char *s);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Time in seconds</p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpGetEncryption">httpGetEncryption</a></h3>
+<h3 class="function"><span class="info">&#160;CUPS 2.0/macOS 10.10&#160;</span><a id="httpGetEncryption">httpGetEncryption</a></h3>
 <p class="description">Get the current encryption mode of a connection.</p>
 <p class="code">
 <a href="#http_encryption_t">http_encryption_t</a> httpGetEncryption(<a href="#http_t">http_t</a> *http);</p>
@@ -4498,6 +7265,17 @@ time_t httpGetDateTime(const char *s);</p>
 been established.
 
 </p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpGetError">httpGetError</a></h3>
+<p class="description">Get the last error on a connection.</p>
+<p class="code">
+int httpGetError(<a href="#http_t">http_t</a> *http);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">HTTP connection</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Error code (errno) value</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpGetExpect">httpGetExpect</a></h3>
 <p class="description">Get the value of the Expect header, if any.</p>
 <p class="code">
@@ -4573,8 +7351,7 @@ and gethostbyname() to get the local hostname with domain.
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Keep-Alive state</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpGetLength2">httpGetLength2</a></h3>
-<p class="description">Get the amount of data remaining from the
-content-length or transfer-encoding fields.</p>
+<p class="description">Get the amount of data remaining from the Content-Length or Transfer-Encoding fields.</p>
 <p class="code">
 off_t httpGetLength2(<a href="#http_t">http_t</a> *http);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4612,8 +7389,7 @@ size_t httpGetReady(<a href="#http_t">http_t</a> *http);</p>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Number of bytes available</p>
 <h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpGetRemaining">httpGetRemaining</a></h3>
-<p class="description">Get the number of remaining bytes in the message
-body or current chunk.</p>
+<p class="description">Get the number of remaining bytes in the message body or current chunk.</p>
 <p class="code">
 size_t httpGetRemaining(<a href="#http_t">http_t</a> *http);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4680,37 +7456,24 @@ char *httpGetSubField2(<a href="#http_t">http_t</a> *http, <a href="#http_field_
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Version number</p>
-<h3 class="function"><a id="httpGets">httpGets</a></h3>
+<h3 class="function"><a id="httpGets2">httpGets2</a></h3>
 <p class="description">Get a line of text from a HTTP connection.</p>
 <p class="code">
-char *httpGets(char *line, int length, <a href="#http_t">http_t</a> *http);</p>
+char *httpGets2(<a href="#http_t">http_t</a> *http, char *line, size_t length);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">HTTP connection</td></tr>
 <tr><th>line</th>
 <td class="description">Line to read into</td></tr>
 <tr><th>length</th>
 <td class="description">Max length of buffer</td></tr>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Line or <code>NULL</code></p>
-<h3 class="function"><a id="httpHead">httpHead</a></h3>
-<p class="description">Send a HEAD request to the server.</p>
-<p class="code">
-int httpHead(<a href="#http_t">http_t</a> *http, const char *uri);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-<tr><th>uri</th>
-<td class="description">URI for head</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
 <h3 class="function"><a id="httpInitialize">httpInitialize</a></h3>
 <p class="description">Initialize the HTTP interface library and set the
-default HTTP proxy (if any).</p>
+                     default HTTP proxy (if any).</p>
 <p class="code">
 void httpInitialize(void);</p>
 <h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpIsChunked">httpIsChunked</a></h3>
@@ -4744,34 +7507,70 @@ int httpIsEncrypted(<a href="#http_t">http_t</a> *http);</p>
 <p class="discussion">This function returns non-zero if the connection is currently encrypted.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpLoadCredentials">httpLoadCredentials</a></h3>
-<p class="description">Load X.509 credentials from a keychain file.</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="httpMD5">httpMD5</a></h3>
+<p class="description">Compute the MD5 sum of the username:group:password.</p>
 <p class="code">
-int httpLoadCredentials(const char *path, <a href="#cups_array_t">cups_array_t</a> **credentials, const char *common_name);</p>
+char *httpMD5(const char *username, const char *realm, const char *passwd, char md5[33]);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>path</th>
-<td class="description">Keychain path or <code>NULL</code> for default</td></tr>
-<tr><th>credentials</th>
-<td class="description">Credentials</td></tr>
-<tr><th>common_name</th>
-<td class="description">Common name for credentials</td></tr>
+<tr><th>username</th>
+<td class="description">User name</td></tr>
+<tr><th>realm</th>
+<td class="description">Realm name</td></tr>
+<tr><th>passwd</th>
+<td class="description">Password string</td></tr>
+<tr><th>md5[33]</th>
+<td class="description">MD5 string</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">0 on success, -1 on error</p>
-<h3 class="function"><a id="httpOptions">httpOptions</a></h3>
-<p class="description">Send an OPTIONS request to the server.</p>
+<p class="description">MD5 sum</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The function was used for HTTP Digest authentication. Since CUPS 2.4.0
+it produces an empty string. Please use <a href="#cupsDoAuthentication"><code>cupsDoAuthentication</code></a> instead.
+
+</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="httpMD5Final">httpMD5Final</a></h3>
+<p class="description">Combine the MD5 sum of the username, group, and password
+                   with the server-supplied nonce value, method, and
+                   request-uri.</p>
 <p class="code">
-int httpOptions(<a href="#http_t">http_t</a> *http, const char *uri);</p>
+char *httpMD5Final(const char *nonce, const char *method, const char *resource, char md5[33]);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-<tr><th>uri</th>
-<td class="description">URI for options</td></tr>
+<tr><th>nonce</th>
+<td class="description">Server nonce value</td></tr>
+<tr><th>method</th>
+<td class="description">METHOD (GET, POST, etc.)</td></tr>
+<tr><th>resource</th>
+<td class="description">Resource path</td></tr>
+<tr><th>md5[33]</th>
+<td class="description">MD5 sum</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
+<p class="description">New sum</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The function was used for HTTP Digest authentication. Since CUPS 2.4.0
+it produces an empty string. Please use <a href="#cupsDoAuthentication"><code>cupsDoAuthentication</code></a> instead.
+
+</p>
+<h3 class="function"><span class="info">&#160;DEPRECATED&#160;</span><a id="httpMD5String">httpMD5String</a></h3>
+<p class="description">Convert an MD5 sum to a character string.</p>
+<p class="code">
+char *httpMD5String(const unsigned char *sum, char md5[33]);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>sum</th>
+<td class="description">MD5 sum data</td></tr>
+<tr><th>md5[33]</th>
+<td class="description">MD5 sum in hex</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">MD5 sum in hex</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The function was used for HTTP Digest authentication. Since CUPS 2.4.0
+it produces an empty string. Please use <a href="#cupsDoAuthentication"><code>cupsDoAuthentication</code></a> instead.
+
+</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpPeek">httpPeek</a></h3>
 <p class="description">Peek at data from a HTTP connection.</p>
 <p class="code">
@@ -4795,32 +7594,6 @@ a buffer as needed.  The data is still available for reading using
 For non-blocking connections the usual timeouts apply.
 
 </p>
-<h3 class="function"><a id="httpPost">httpPost</a></h3>
-<p class="description">Send a POST request to the server.</p>
-<p class="code">
-int httpPost(<a href="#http_t">http_t</a> *http, const char *uri);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-<tr><th>uri</th>
-<td class="description">URI for post</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
-<h3 class="function"><a id="httpPut">httpPut</a></h3>
-<p class="description">Send a PUT request to the server.</p>
-<p class="code">
-int httpPut(<a href="#http_t">http_t</a> *http, const char *uri);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-<tr><th>uri</th>
-<td class="description">URI to put</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpRead2">httpRead2</a></h3>
 <p class="description">Read data from a HTTP connection.</p>
 <p class="code">
@@ -4853,7 +7626,7 @@ ssize_t httpRead2(<a href="#http_t">http_t</a> *http, char *buffer, size_t lengt
 <p class="description">New state of connection</p>
 <h3 class="function"><a id="httpReconnect2">httpReconnect2</a></h3>
 <p class="description">Reconnect to a HTTP server with timeout and optional
-cancel.</p>
+                     cancel.</p>
 <p class="code">
 int httpReconnect2(<a href="#http_t">http_t</a> *http, int msec, int *cancel);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4869,7 +7642,7 @@ int httpReconnect2(<a href="#http_t">http_t</a> *http, int msec, int *cancel);</
 <p class="description">0 on success, non-zero on failure</p>
 <h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpResolveHostname">httpResolveHostname</a></h3>
 <p class="description">Resolve the hostname of the HTTP connection
-address.</p>
+                          address.</p>
 <p class="code">
 const char *httpResolveHostname(<a href="#http_t">http_t</a> *http, char *buffer, size_t bufsize);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4883,24 +7656,47 @@ const char *httpResolveHostname(<a href="#http_t">http_t</a> *http, char *buffer
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Resolved hostname or <code>NULL</code></p>
-<h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpSaveCredentials">httpSaveCredentials</a></h3>
-<p class="description">Save X.509 credentials to a keychain file.</p>
+<h3 class="function"><a id="httpResolveURI">httpResolveURI</a></h3>
+<p class="description">Resolve a DNS-SD URI.</p>
 <p class="code">
-int httpSaveCredentials(const char *path, <a href="#cups_array_t">cups_array_t</a> *credentials, const char *common_name);</p>
+const char *httpResolveURI(const char *uri, char *resolved_uri, size_t resolved_size, <a href="#http_resolve_t">http_resolve_t</a> options, <a href="#http_resolve_cb_t">http_resolve_cb_t</a> cb, void *cb_data);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>path</th>
-<td class="description">Keychain path or <code>NULL</code> for default</td></tr>
-<tr><th>credentials</th>
-<td class="description">Credentials</td></tr>
-<tr><th>common_name</th>
-<td class="description">Common name for credentials</td></tr>
+<tr><th>uri</th>
+<td class="description">DNS-SD URI</td></tr>
+<tr><th>resolved_uri</th>
+<td class="description">Buffer for resolved URI</td></tr>
+<tr><th>resolved_size</th>
+<td class="description">Size of URI buffer</td></tr>
+<tr><th>options</th>
+<td class="description">Resolve options</td></tr>
+<tr><th>cb</th>
+<td class="description">Continue callback function</td></tr>
+<tr><th>cb_data</th>
+<td class="description">Context pointer for callback</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">-1 on error, 0 on success</p>
+<p class="description">Resolved URI</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function resolves a DNS-SD URI of the form
+&quot;scheme://service-instance-name._protocol._tcp.domain/...&quot;.  The &quot;options&quot;
+parameter specifies a bitfield of resolution options including:
+
+</p><ul>
+<li><code>HTTP_RESOLVE_DEFAULT</code>: Use default options
+</li>
+<li><code>HTTP_RESOLVE_FQDN</code>: Resolve the fully-qualified domain name instead of an IP address
+</li>
+<li><code>HTTP_RESOLVE_FAXOUT</code>: Resolve the FaxOut service instead of Print (IPP/IPPS)</li>
+</ul>
+<p class="discussion">The &quot;cb&quot; parameter specifies a callback that allows resolution to be
+terminated.  The callback is provided the &quot;cb_data&quot; value and returns a
+<code>bool</code> value that is <code>true</code> to continue and <code>false</code> to stop.  If no callback
+is specified (&quot;cb&quot; is <code>NULL</code>), then this function will block up to 90 seconds
+to resolve the specified URI.</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpSeparateURI">httpSeparateURI</a></h3>
 <p class="description">Separate a Universal Resource Identifier into its
-components.</p>
+                      components.</p>
 <p class="code">
 <a href="#http_uri_status_t">http_uri_status_t</a> httpSeparateURI(<a href="#http_uri_coding_t">http_uri_coding_t</a> decoding, const char *uri, char *scheme, int schemelen, char *username, int usernamelen, char *host, int hostlen, int *port, char *resource, int resourcelen);</p>
 <h4 class="parameters">Parameters</h4>
@@ -4947,10 +7743,20 @@ void httpSetAuthString(<a href="#http_t">http_t</a> *http, const char *scheme, c
 <p class="discussion">This function just stores a copy of the current authorization string in
 the HTTP connection object.  You must still call <a href="#httpSetField"><code>httpSetField</code></a> to set
 <code>HTTP_FIELD_AUTHORIZATION</code> prior to issuing a HTTP request using
-<a href="#httpGet"><code>httpGet</code></a>, <a href="#httpHead"><code>httpHead</code></a>, <a href="#httpOptions"><code>httpOptions</code></a>, <a href="#httpPost"><code>httpPost</code></a>, or
-<a href="#httpPut"><code>httpPut</code></a>.
+<a href="#httpWriteRequest"><code>httpWriteRequest</code></a>.
 
 </p>
+<h3 class="function"><a id="httpSetBlocking">httpSetBlocking</a></h3>
+<p class="description">Set blocking/non-blocking behavior on a connection.</p>
+<p class="code">
+void httpSetBlocking(<a href="#http_t">http_t</a> *http, bool b);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">HTTP connection</td></tr>
+<tr><th>b</th>
+<td class="description"><code>true</code> for blocking, <code>false</code> for non-blocking</td></tr>
+</tbody></table>
 <h3 class="function"><span class="info">&#160;CUPS 1.1.19/macOS 10.3&#160;</span><a id="httpSetCookie">httpSetCookie</a></h3>
 <p class="description">Set the cookie value(s).</p>
 <p class="code">
@@ -4962,20 +7768,6 @@ void httpSetCookie(<a href="#http_t">http_t</a> *http, const char *cookie);</p>
 <tr><th>cookie</th>
 <td class="description">Cookie string</td></tr>
 </tbody></table>
-<h3 class="function"><span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span><a id="httpSetCredentials">httpSetCredentials</a></h3>
-<p class="description">Set the credentials associated with an encrypted
-connection.</p>
-<p class="code">
-int httpSetCredentials(<a href="#http_t">http_t</a> *http, <a href="#cups_array_t">cups_array_t</a> *credentials);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>http</th>
-<td class="description">HTTP connection</td></tr>
-<tr><th>credentials</th>
-<td class="description">Array of credentials</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpSetDefaultField">httpSetDefaultField</a></h3>
 <p class="description">Set the default value of an HTTP header.</p>
 <p class="code">
@@ -4994,6 +7786,19 @@ void httpSetDefaultField(<a href="#http_t">http_t</a> *http, <a href="#http_fiel
 and <code>HTTP_FIELD_USER_AGENT</code> can be set.
 
 </p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpSetEncryption">httpSetEncryption</a></h3>
+<p class="description">Set the required encryption on the link.</p>
+<p class="code">
+bool httpSetEncryption(<a href="#http_t">http_t</a> *http, <a href="#http_encryption_t">http_encryption_t</a> e);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">HTTP connection</td></tr>
+<tr><th>e</th>
+<td class="description">New encryption preference</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="httpSetExpect">httpSetExpect</a></h3>
 <p class="description">Set the Expect: header in a request.</p>
 <p class="code">
@@ -5003,8 +7808,7 @@ void httpSetExpect(<a href="#http_t">http_t</a> *http, http_status_t expect);</p
 <tr><th>http</th>
 <td class="description">HTTP connection</td></tr>
 <tr><th>expect</th>
-<td class="description">HTTP status to expect
-(<code>HTTP_STATUS_CONTINUE</code>)</td></tr>
+<td class="description">HTTP status to expect (<code>HTTP_STATUS_CONTINUE</code>)</td></tr>
 </tbody></table>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">Currently only <code>HTTP_STATUS_CONTINUE</code> is supported for the &quot;expect&quot;
@@ -5055,8 +7859,7 @@ void httpSetTimeout(<a href="#http_t">http_t</a> *http, double timeout, <a href=
 <tr><th>http</th>
 <td class="description">HTTP connection</td></tr>
 <tr><th>timeout</th>
-<td class="description">Number of seconds for timeout,
-must be greater than 0</td></tr>
+<td class="description">Number of seconds for timeout, must be greater than <code>0.0</code></td></tr>
 <tr><th>cb</th>
 <td class="description">Callback function or <code>NULL</code></td></tr>
 <tr><th>user_data</th>
@@ -5087,10 +7890,10 @@ const char *httpStateString(<a href="#http_state_t">http_state_t</a> state);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">State string</p>
-<h3 class="function"><a id="httpStatus">httpStatus</a></h3>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpStatusString">httpStatusString</a></h3>
 <p class="description">Return a short string describing a HTTP status code.</p>
 <p class="code">
-const char *httpStatus(http_status_t status);</p>
+const char *httpStatusString(http_status_t status);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>status</th>
@@ -5100,7 +7903,9 @@ const char *httpStatus(http_status_t status);</p>
 <p class="description">Localized status string</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">The returned string is localized to the current POSIX locale and is based
-on the status strings defined in RFC 7231.</p>
+on the status strings defined in RFC 7231.
+
+</p>
 <h3 class="function"><span class="info">&#160;CUPS 2.0/OS 10.10&#160;</span><a id="httpURIStatusString">httpURIStatusString</a></h3>
 <p class="description">Return a string describing a URI status code.</p>
 <p class="code">
@@ -5151,6 +7956,21 @@ ssize_t httpWrite2(<a href="#http_t">http_t</a> *http, const char *buffer, size_
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Number of bytes written</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="httpWriteRequest">httpWriteRequest</a></h3>
+<p class="description">Send a HTTP request.</p>
+<p class="code">
+bool httpWriteRequest(<a href="#http_t">http_t</a> *http, const char *method, const char *uri);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>http</th>
+<td class="description">HTTP connection</td></tr>
+<tr><th>method</th>
+<td class="description">Method string (&quot;GET&quot;, &quot;POST&quot;, etc.)</td></tr>
+<tr><th>uri</th>
+<td class="description">URI</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="httpWriteResponse">httpWriteResponse</a></h3>
 <p class="description">Write a HTTP response to a client connection.</p>
 <p class="code">
@@ -5182,10 +8002,10 @@ int httpWriteResponse(<a href="#http_t">http_t</a> *http, http_status_t status);
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5210,10 +8030,10 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5236,10 +8056,10 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5266,10 +8086,41 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
+(<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
+event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
+(<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
+(<code>IPP_TAG_SUBSCRIPTION</code>), or unsupported (<code>IPP_TAG_UNSUPPORTED_GROUP</code>).
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="ippAddCredentialsString">ippAddCredentialsString</a></h3>
+<p class="description">Add a credentials string attribute to an IPP message.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippAddCredentialsString(<a href="#ipp_t">ipp_t</a> *ipp, ipp_tag_t group, const char *name, const char *credentials);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ipp</th>
+<td class="description">IPP message</td></tr>
+<tr><th>group</th>
+<td class="description">IPP group</td></tr>
+<tr><th>name</th>
+<td class="description">Attribute name</td></tr>
+<tr><th>credentials</th>
+<td class="description">Credentials string</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function adds a 1setOf text attribute to an IPP message corresponding to
+the specified credentials string.<br>
+<br>
+The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5294,10 +8145,10 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5322,10 +8173,12 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">This function adds an integer or enum attribute to an IPP message.<br>
+<br>
+The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5355,10 +8208,10 @@ Supported values include enum (<code>IPP_TAG_ENUM</code>) and integer
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5386,10 +8239,10 @@ Supported values include enum (<code>IPP_TAG_ENUM</code>) and integer
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5414,10 +8267,10 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5450,16 +8303,16 @@ admin-define (<code>IPP_TAG_ADMINDEFINE</code>).
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
 (<code>IPP_TAG_SUBSCRIPTION</code>), or unsupported (<code>IPP_TAG_UNSUPPORTED_GROUP</code>).<br>
 <br>
-The <code>lower</code> parameter must be less than or equal to the <code>upper</code> parameter.</p>
+The &quot;lower&quot; parameter must be less than or equal to the &quot;upper&quot; parameter.</p>
 <h3 class="function"><a id="ippAddRanges">ippAddRanges</a></h3>
 <p class="description">Add ranges of values to an IPP message.</p>
 <p class="code">
@@ -5482,10 +8335,10 @@ The <code>lower</code> parameter must be less than or equal to the <code>upper</
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5512,10 +8365,10 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5544,10 +8397,10 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5564,7 +8417,7 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.</p>
 <h3 class="function"><a id="ippAddString">ippAddString</a></h3>
 <p class="description">Add a language-encoded string to an IPP message.</p>
@@ -5588,10 +8441,10 @@ the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ip
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5600,12 +8453,12 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
 (<code>IPP_TAG_KEYWORD</code>), language (<code>IPP_TAG_LANGUAGE</code>), mimeMediaType
 (<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code>), nameWithLanguage
-(<code>IPP_TAG_NAMELANG), text (</code>code IPP_TAG_TEXT@), textWithLanguage
-(<code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), and uriScheme
-(<code>IPP_TAG_URISCHEME</code>).<br>
-<br>
-The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage and
-textWithLanguage string values and must be <code>NULL</code> for all other string values.</p>
+(<code>IPP_TAG_NAMELANG), text (`IPP_TAG_TEXT`), textWithLanguage
+(`IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), and uriScheme
+(`IPP_TAG_URISCHEME`).
+
+The "language" parameter must be non-`NULL` for nameWithLanguage and
+textWithLanguage string values and must be `NULL` for all other string values.</code></p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="ippAddStringf">ippAddStringf</a></h3>
 <p class="description">Add a formatted string to an IPP message.</p>
 <p class="code">
@@ -5630,10 +8483,10 @@ textWithLanguage string values and must be <code>NULL</code> for all other strin
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document
 (<code>IPP_TAG_DOCUMENT</code>), event notification
 (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation (<code>IPP_TAG_OPERATION</code>),
@@ -5643,20 +8496,20 @@ or unsupported (<code>IPP_TAG_UNSUPPORTED_GROUP</code>).<br>
 Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
 (<code>IPP_TAG_KEYWORD</code>), language (<code>IPP_TAG_LANGUAGE</code>), mimeMediaType
 (<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code>), nameWithLanguage
-(<code>IPP_TAG_NAMELANG), text (</code>code IPP_TAG_TEXT@), textWithLanguage
-(<code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), and uriScheme
-(<code>IPP_TAG_URISCHEME</code>).<br>
-<br>
-The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage
-and textWithLanguage string values and must be <code>NULL</code> for all other
-string values.<br>
-<br>
-The <code>format</code> parameter uses formatting characters compatible with the
+(<code>IPP_TAG_NAMELANG), text (`IPP_TAG_TEXT`), textWithLanguage
+(`IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), and uriScheme
+(`IPP_TAG_URISCHEME`).
+
+The "language" parameter must be non-`NULL` for nameWithLanguage
+and textWithLanguage string values and must be `NULL` for all other
+string values.
+
+The "format" parameter uses formatting characters compatible with the
 printf family of standard functions.  Additional arguments follow it as
 needed.  The formatted string is truncated as needed to the maximum length of
 the corresponding value type.
 
-</p>
+</code>since CUPS 1.7/macOS 10.9@</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="ippAddStringfv">ippAddStringfv</a></h3>
 <p class="description">Add a formatted string to an IPP message.</p>
 <p class="code">
@@ -5681,10 +8534,10 @@ the corresponding value type.
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document
 (<code>IPP_TAG_DOCUMENT</code>), event notification
 (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation (<code>IPP_TAG_OPERATION</code>),
@@ -5694,20 +8547,20 @@ or unsupported (<code>IPP_TAG_UNSUPPORTED_GROUP</code>).<br>
 Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
 (<code>IPP_TAG_KEYWORD</code>), language (<code>IPP_TAG_LANGUAGE</code>), mimeMediaType
 (<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code>), nameWithLanguage
-(<code>IPP_TAG_NAMELANG), text (</code>code IPP_TAG_TEXT@), textWithLanguage
-(<code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), and uriScheme
-(<code>IPP_TAG_URISCHEME</code>).<br>
-<br>
-The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage
-and textWithLanguage string values and must be <code>NULL</code> for all other
-string values.<br>
-<br>
-The <code>format</code> parameter uses formatting characters compatible with the
+(<code>IPP_TAG_NAMELANG), text (`IPP_TAG_TEXT`), textWithLanguage
+(`IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), and uriScheme
+(`IPP_TAG_URISCHEME`).
+
+The "language" parameter must be non-`NULL` for nameWithLanguage
+and textWithLanguage string values and must be `NULL` for all other
+string values.
+
+The "format" parameter uses formatting characters compatible with the
 printf family of standard functions.  Additional arguments are passed in the
-stdarg pointer <code>ap</code>.  The formatted string is truncated as needed to the
+stdarg pointer "ap".  The formatted string is truncated as needed to the
 maximum length of the corresponding value type.
 
-</p>
+</code>since CUPS 1.7/macOS 10.9@</p>
 <h3 class="function"><a id="ippAddStrings">ippAddStrings</a></h3>
 <p class="description">Add language-encoded strings to an IPP message.</p>
 <p class="code">
@@ -5732,10 +8585,10 @@ maximum length of the corresponding value type.
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -5744,12 +8597,12 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
 (<code>IPP_TAG_KEYWORD</code>), language (<code>IPP_TAG_LANGUAGE</code>), mimeMediaType
 (<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code>), nameWithLanguage
-(<code>IPP_TAG_NAMELANG), text (</code>code IPP_TAG_TEXT@), textWithLanguage
-(<code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), and uriScheme
-(<code>IPP_TAG_URISCHEME</code>).<br>
-<br>
-The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage and
-textWithLanguage string values and must be <code>NULL</code> for all other string values.</p>
+(<code>IPP_TAG_NAMELANG), text (`IPP_TAG_TEXT`), textWithLanguage
+(`IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), and uriScheme
+(`IPP_TAG_URISCHEME`).
+
+The "language" parameter must be non-`NULL` for nameWithLanguage and
+textWithLanguage string values and must be `NULL` for all other string values.</code></p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippAttributeString">ippAttributeString</a></h3>
 <p class="description">Convert the attribute's value to a string.</p>
 <p class="code">
@@ -5773,7 +8626,7 @@ just like (v)snprintf.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="ippContainsInteger">ippContainsInteger</a></h3>
 <p class="description">Determine whether an attribute contains the
-specified value or is within the list of ranges.</p>
+                         specified value or is within the list of ranges.</p>
 <p class="code">
 int ippContainsInteger(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, int value);</p>
 <h4 class="parameters">Parameters</h4>
@@ -5793,7 +8646,7 @@ the attribute.
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="ippContainsString">ippContainsString</a></h3>
 <p class="description">Determine whether an attribute contains the
-specified string value.</p>
+                        specified string value.</p>
 <p class="code">
 int ippContainsString(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, const char *value);</p>
 <h4 class="parameters">Parameters</h4>
@@ -5827,7 +8680,7 @@ naturalLanguage, mimeMediaType, name, text, uri, or uriScheme value.
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">The specified attribute, <code>attr</code>, is copied to the destination IPP message.
-When <code>quickcopy</code> is non-zero, a &quot;shallow&quot; reference copy of the attribute is
+When &quot;quickcopy&quot; is non-zero, a &quot;shallow&quot; reference copy of the attribute is
 created - this should only be done as long as the original source IPP message will
 not be freed for the life of the destination.
 
@@ -5835,7 +8688,7 @@ not be freed for the life of the destination.
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippCopyAttributes">ippCopyAttributes</a></h3>
 <p class="description">Copy attributes from one IPP message to another.</p>
 <p class="code">
-int ippCopyAttributes(<a href="#ipp_t">ipp_t</a> *dst, <a href="#ipp_t">ipp_t</a> *src, int quickcopy, <a href="#ipp_copycb_t">ipp_copycb_t</a> cb, void *context);</p>
+int ippCopyAttributes(<a href="#ipp_t">ipp_t</a> *dst, <a href="#ipp_t">ipp_t</a> *src, int quickcopy, <a href="#ipp_copy_cb_t">ipp_copy_cb_t</a> cb, void *context);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>dst</th>
@@ -5852,20 +8705,36 @@ int ippCopyAttributes(<a href="#ipp_t">ipp_t</a> *dst, <a href="#ipp_t">ipp_t</a
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Zero or more attributes are copied from the source IPP message, <code>src</code>, to the
-destination IPP message, <code>dst</code>. When <code>quickcopy</code> is non-zero, a &quot;shallow&quot;
-reference copy of the attribute is created - this should only be done as long as the
-original source IPP message will not be freed for the life of the destination.<br>
+<p class="discussion">Zero or more attributes are copied from the source IPP message &quot;src&quot; to the
+destination IPP message &quot;dst&quot;. When &quot;quickcopy&quot; is non-zero, a &quot;shallow&quot;
+reference copy of the attribute is created - this should only be done as long
+as the original source IPP message will not be freed for the life of the
+destination.<br>
 <br>
-The <code>cb</code> and <code>context</code> parameters provide a generic way to &quot;filter&quot; the
+The &quot;cb&quot; and &quot;context&quot; parameters provide a generic way to &quot;filter&quot; the
 attributes that are copied - the function must return 1 to copy the attribute or
 0 to skip it. The function may also choose to do a partial copy of the source attribute
 itself.
 
 </p>
+<h3 class="function"><a id="ippCopyCredentialsString">ippCopyCredentialsString</a></h3>
+<p class="description">Copy a credentials value from an IPP attribute.</p>
+<p class="code">
+char *ippCopyCredentialsString(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>attr</th>
+<td class="description">Attribute</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Combined string or <code>NULL</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function concatenates the 1setOf text credential values of an attribute,
+separated by newlines.  The returned string must be freed using the <code>free</code>
+function.</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="ippCreateRequestedArray">ippCreateRequestedArray</a></h3>
 <p class="description">Create a CUPS array of attribute names from the
-given requested-attributes attribute.</p>
+                              given requested-attributes attribute.</p>
 <p class="code">
 <a href="#cups_array_t">cups_array_t</a> *ippCreateRequestedArray(<a href="#ipp_t">ipp_t</a> *request);</p>
 <h4 class="parameters">Parameters</h4>
@@ -5892,7 +8761,7 @@ using the <code>cupsArrayDelete</code> function.
 </p>
 <h3 class="function"><a id="ippDateToTime">ippDateToTime</a></h3>
 <p class="description">Convert from RFC 2579 Date/Time format to time in
-seconds.</p>
+                    seconds.</p>
 <p class="code">
 time_t ippDateToTime(const <a href="#ipp_uchar_t">ipp_uchar_t</a> *date);</p>
 <h4 class="parameters">Parameters</h4>
@@ -5940,10 +8809,12 @@ int ippDeleteValues(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">
 <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 <code>element</code> parameter specifies the first value to delete, starting at
-0. It must be less than the number of values returned by <a href="#ippGetCount"><code>ippGetCount</code></a>.<br>
+<p class="discussion">This function deletes one or more values in an attribute.  The &quot;element&quot;
+parameter specifies the first value to delete, starting at 0. It must be
+less than the number of values returned by <a href="#ippGetCount"><code>ippGetCount</code></a>.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value,
+which will set the variable to <code>NULL</code>.<br>
 <br>
 Deleting all values in an attribute deletes the attribute.
 
@@ -5996,6 +8867,390 @@ ipp_status_t ippErrorValue(const char *name);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">IPP status code</p>
+<h3 class="function"><a id="ippFileClose">ippFileClose</a></h3>
+<p class="description">Close an IPP data file.</p>
+<p class="code">
+bool ippFileClose(<a href="#ipp_file_t">ipp_file_t</a> *file);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function closes the current IPP data file.  The <code>ipp_file_t</code> object can
+be reused for another file as needed.</p>
+<h3 class="function"><a id="ippFileDelete">ippFileDelete</a></h3>
+<p class="description">Close an IPP data file and free all memory.</p>
+<p class="code">
+bool ippFileDelete(<a href="#ipp_file_t">ipp_file_t</a> *file);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function closes an IPP data file, if necessary, and frees all memory
+associated with it.</p>
+<h3 class="function"><a id="ippFileExpandVars">ippFileExpandVars</a></h3>
+<p class="description">Expand IPP data file and environment variables in a string.</p>
+<p class="code">
+size_t ippFileExpandVars(<a href="#ipp_file_t">ipp_file_t</a> *file, char *dst, const char *src, size_t dstsize);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>dst</th>
+<td class="description">Destination buffer</td></tr>
+<tr><th>src</th>
+<td class="description">Source string</td></tr>
+<tr><th>dstsize</th>
+<td class="description">Size of destination buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Required size for expanded variables</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function expands IPP data file variables of the form &quot;$name&quot; and
+environment variables of the form &quot;$ENV[name]&quot; in the source string to the
+destination string.  The</p>
+<h3 class="function"><a id="ippFileGetAttribute">ippFileGetAttribute</a></h3>
+<p class="description">Get a single named attribute from an IPP data file.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippFileGetAttribute(<a href="#ipp_file_t">ipp_file_t</a> *file, const char *name, ipp_tag_t value_tag);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>name</th>
+<td class="description">Attribute name</td></tr>
+<tr><th>value_tag</th>
+<td class="description">Value tag or <code>IPP_TAG_ZERO</code> for any</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Attribute or <code>NULL</code> if none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function finds the first occurence of a named attribute in the current
+IPP attributes in the specified data file.  Unlike
+<a href="#ippFileGetAttributes"><code>ippFileGetAttributes</code></a>, this function does not clear the attribute
+state.</p>
+<h3 class="function"><a id="ippFileGetAttributes">ippFileGetAttributes</a></h3>
+<p class="description">Get the current set of attributes from an IPP data file.</p>
+<p class="code">
+<a href="#ipp_t">ipp_t</a> *ippFileGetAttributes(<a href="#ipp_file_t">ipp_file_t</a> *file);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">IPP attributes</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function gets the current set of attributes from an IPP data file.</p>
+<h3 class="function"><a id="ippFileGetFilename">ippFileGetFilename</a></h3>
+<p class="description">Get the filename for an IPP data file.</p>
+<p class="code">
+const char *ippFileGetFilename(<a href="#ipp_file_t">ipp_file_t</a> *file);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Filename</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns the filename associated with an IPP data file.</p>
+<h3 class="function"><a id="ippFileGetLineNumber">ippFileGetLineNumber</a></h3>
+<p class="description">Get the current line number in an IPP data file.</p>
+<p class="code">
+int ippFileGetLineNumber(<a href="#ipp_file_t">ipp_file_t</a> *file);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Line number</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns the current line number in an IPP data file.</p>
+<h3 class="function"><a id="ippFileGetVar">ippFileGetVar</a></h3>
+<p class="description">Get the value of an IPP data file variable.</p>
+<p class="code">
+const char *ippFileGetVar(<a href="#ipp_file_t">ipp_file_t</a> *file, const char *name);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>name</th>
+<td class="description">Variable name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Variable value or <code>NULL</code> if none.</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns the value of an IPP data file variable.  <code>NULL</code> is
+returned if the variable is not set.</p>
+<h3 class="function"><a id="ippFileNew">ippFileNew</a></h3>
+<p class="description">Create a new IPP data file object for reading or writing.</p>
+<p class="code">
+<a href="#ipp_file_t">ipp_file_t</a> *ippFileNew(<a href="#ipp_file_t">ipp_file_t</a> *parent, <a href="#ipp_fattr_cb_t">ipp_fattr_cb_t</a> attr_cb, <a href="#ipp_ferror_cb_t">ipp_ferror_cb_t</a> error_cb, void *cb_data);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>parent</th>
+<td class="description">Parent data file or <code>NULL</code> for none</td></tr>
+<tr><th>attr_cb</th>
+<td class="description">Attribute filtering callback, if any</td></tr>
+<tr><th>error_cb</th>
+<td class="description">Error reporting callback, if any</td></tr>
+<tr><th>cb_data</th>
+<td class="description">Callback data, if any</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">IPP data file</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function opens an IPP data file for reading (mode=&quot;r&quot;) or writing
+(mode=&quot;w&quot;).  If the &quot;parent&quot; argument is not <code>NULL</code>, all variables from the
+parent data file are copied to the new file.</p>
+<h3 class="function"><a id="ippFileOpen">ippFileOpen</a></h3>
+<p class="description">Open an IPP data file for reading or writing.</p>
+<p class="code">
+bool ippFileOpen(<a href="#ipp_file_t">ipp_file_t</a> *file, const char *filename, const char *mode);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>filename</th>
+<td class="description">Filename to open</td></tr>
+<tr><th>mode</th>
+<td class="description">Open mode - &quot;r&quot; to read and &quot;w&quot; to write</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function opens an IPP data file for reading (mode=&quot;r&quot;) or writing
+(mode=&quot;w&quot;).  If the &quot;parent&quot; argument is not <code>NULL</code>, all variables from the
+parent data file are copied to the new file.</p>
+<h3 class="function"><a id="ippFileRead">ippFileRead</a></h3>
+<p class="description">Read an IPP data file.</p>
+<p class="code">
+bool ippFileRead(<a href="#ipp_file_t">ipp_file_t</a> *file, <a href="#ipp_ftoken_cb_t">ipp_ftoken_cb_t</a> token_cb, bool with_groups);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>token_cb</th>
+<td class="description">Token callback</td></tr>
+<tr><th>with_groups</th>
+<td class="description">Read attributes with GROUP directives</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h3 class="function"><a id="ippFileReadCollection">ippFileReadCollection</a></h3>
+<p class="description">Read a collection from an IPP data file.</p>
+<p class="code">
+<a href="#ipp_t">ipp_t</a> *ippFileReadCollection(<a href="#ipp_file_t">ipp_file_t</a> *file);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Collection value</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function reads a collection value from an IPP data file.  Collection
+values are surrounded by curly braces (&quot;{&quot; and &quot;}&quot;) and have &quot;MEMBER&quot;
+directives to define member attributes in the collection.</p>
+<h3 class="function"><a id="ippFileReadToken">ippFileReadToken</a></h3>
+<p class="description">Read a token from an IPP data file.</p>
+<p class="code">
+bool ippFileReadToken(<a href="#ipp_file_t">ipp_file_t</a> *file, char *token, size_t tokensize);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>token</th>
+<td class="description">Token buffer</td></tr>
+<tr><th>tokensize</th>
+<td class="description">Size of token buffer</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function reads a single token or value from an IPP data file, skipping
+comments and whitespace as needed.</p>
+<h3 class="function"><a id="ippFileRestorePosition">ippFileRestorePosition</a></h3>
+<p class="description">Restore the previous position in an IPP data file.</p>
+<p class="code">
+bool ippFileRestorePosition(<a href="#ipp_file_t">ipp_file_t</a> *file);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function restores the previous position in an IPP data file that is open
+for reading.</p>
+<h3 class="function"><a id="ippFileSavePosition">ippFileSavePosition</a></h3>
+<p class="description">Save the current position in an IPP data file.</p>
+<p class="code">
+bool ippFileSavePosition(<a href="#ipp_file_t">ipp_file_t</a> *file);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function saves the current position in an IPP data file that is open
+for reading.</p>
+<h3 class="function"><a id="ippFileSetAttributes">ippFileSetAttributes</a></h3>
+<p class="description">Set the attributes for an IPP data file.</p>
+<p class="code">
+bool ippFileSetAttributes(<a href="#ipp_file_t">ipp_file_t</a> *file, <a href="#ipp_t">ipp_t</a> *attrs);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>attrs</th>
+<td class="description">IPP attributes</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sets the current set of attributes for an IPP data file,
+typically an empty collection created with <a href="#ippNew"><code>ippNew</code></a>.</p>
+<h3 class="function"><a id="ippFileSetGroupTag">ippFileSetGroupTag</a></h3>
+<p class="description">Set the group tag for an IPP data file.</p>
+<p class="code">
+bool ippFileSetGroupTag(<a href="#ipp_file_t">ipp_file_t</a> *file, ipp_tag_t group_tag);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>group_tag</th>
+<td class="description">Group tag</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sets the group tag associated with attributes that are read
+from an IPP data file.</p>
+<h3 class="function"><a id="ippFileSetVar">ippFileSetVar</a></h3>
+<p class="description">Set an IPP data file variable to a constant value.</p>
+<p class="code">
+bool ippFileSetVar(<a href="#ipp_file_t">ipp_file_t</a> *file, const char *name, const char *value);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>name</th>
+<td class="description">Variable name</td></tr>
+<tr><th>value</th>
+<td class="description">Value</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sets an IPP data file variable to a constant value.  Setting
+the &quot;uri&quot; variable also initializes the &quot;scheme&quot;, &quot;uriuser&quot;, &quot;hostname&quot;,
+&quot;port&quot;, and &quot;resource&quot; variables.</p>
+<h3 class="function"><a id="ippFileSetVarf">ippFileSetVarf</a></h3>
+<p class="description">Set an IPP data file variable to a formatted value.</p>
+<p class="code">
+bool ippFileSetVarf(<a href="#ipp_file_t">ipp_file_t</a> *file, const char *name, const char *value, ...);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>name</th>
+<td class="description">Variable name</td></tr>
+<tr><th>value</th>
+<td class="description">Printf-style value</td></tr>
+<tr><th>...</th>
+<td class="description">Additional arguments as needed</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function sets an IPP data file variable to a formatted value.  Setting
+the &quot;uri&quot; variable also initializes the &quot;scheme&quot;, &quot;uriuser&quot;, &quot;hostname&quot;,
+&quot;port&quot;, and &quot;resource&quot; variables.</p>
+<h3 class="function"><a id="ippFileWriteAttributes">ippFileWriteAttributes</a></h3>
+<p class="description">Write an IPP message to an IPP data file.</p>
+<p class="code">
+bool ippFileWriteAttributes(<a href="#ipp_file_t">ipp_file_t</a> *file, <a href="#ipp_t">ipp_t</a> *ipp, bool with_groups);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>ipp</th>
+<td class="description">IPP attributes to write</td></tr>
+<tr><th>with_groups</th>
+<td class="description"><code>true</code> to include GROUPs, <code>false</code> otherwise</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function writes an IPP message to an IPP data file using the attribute
+filter specified in the call to <a href="#ippFileOpen"><code>ippFileOpen</code></a>.  If &quot;with_group&quot; is
+<code>true</code>, &quot;GROUP&quot; directives are written as necessary to place the attributes
+in the correct groups.</p>
+<h3 class="function"><a id="ippFileWriteComment">ippFileWriteComment</a></h3>
+<p class="description">Write a comment to an IPP data file.</p>
+<p class="code">
+bool ippFileWriteComment(<a href="#ipp_file_t">ipp_file_t</a> *file, const char *comment, ...);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>comment</th>
+<td class="description">Printf-style comment string</td></tr>
+<tr><th>...</th>
+<td class="description">Additional arguments as needed</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function writes a comment to an IPP data file.  Every line in the string
+is prefixed with the &quot;#&quot; character and indented as needed.</p>
+<h3 class="function"><a id="ippFileWriteToken">ippFileWriteToken</a></h3>
+<p class="description">Write a token or value string to an IPP data file.</p>
+<p class="code">
+bool ippFileWriteToken(<a href="#ipp_file_t">ipp_file_t</a> *file, const char *token);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>token</th>
+<td class="description">Token/value string</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function writes a token or value string to an IPP data file, quoting
+and indenting the string as needed.</p>
+<h3 class="function"><a id="ippFileWriteTokenf">ippFileWriteTokenf</a></h3>
+<p class="description">Write a formatted token or value string to an IPP data file.</p>
+<p class="code">
+bool ippFileWriteTokenf(<a href="#ipp_file_t">ipp_file_t</a> *file, const char *token, ...);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>file</th>
+<td class="description">IPP data file</td></tr>
+<tr><th>token</th>
+<td class="description">Printf-style token/value string</td></tr>
+<tr><th>...</th>
+<td class="description">Additional arguments as needed</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description"><code>true</code> on success, <code>false</code> on error</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function writes a formatted token or value string to an IPP data file,
+quoting and indenting the string as needed.</p>
 <h3 class="function"><a id="ippFindAttribute">ippFindAttribute</a></h3>
 <p class="description">Find a named attribute in a request.</p>
 <p class="code">
@@ -6012,9 +9267,9 @@ ipp_status_t ippErrorValue(const char *name);</p>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Matching attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Starting with CUPS 2.0, the attribute name can contain a hierarchical list
-of attribute and member names separated by slashes, for example
-&quot;media-col/media-size&quot;.</p>
+<p class="discussion">This function finds the first occurrence of a named attribute in an IPP
+message.  The attribute name can contain a hierarchical list of attribute and
+member names separated by slashes, for example &quot;media-col/media-size&quot;.</p>
 <h3 class="function"><a id="ippFindNextAttribute">ippFindNextAttribute</a></h3>
 <p class="description">Find the next named attribute in a request.</p>
 <p class="code">
@@ -6031,20 +9286,9 @@ of attribute and member names separated by slashes, for example
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Matching attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Starting with CUPS 2.0, the attribute name can contain a hierarchical list
-of attribute and member names separated by slashes, for example
-&quot;media-col/media-size&quot;.</p>
-<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippFirstAttribute">ippFirstAttribute</a></h3>
-<p class="description">Return the first attribute in the message.</p>
-<p class="code">
-<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippFirstAttribute(<a href="#ipp_t">ipp_t</a> *ipp);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>ipp</th>
-<td class="description">IPP message</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">First attribute or <code>NULL</code> if none</p>
+<p class="discussion">This function finds the next named attribute in an IPP message.  The
+attribute name can contain a hierarchical list of attribute and member names
+separated by slashes, for example &quot;media-col/media-size&quot;.</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippGetBoolean">ippGetBoolean</a></h3>
 <p class="description">Get a boolean value for an attribute.</p>
 <p class="code">
@@ -6059,7 +9303,7 @@ int ippGetBoolean(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, int elem
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Boolean value or 0 on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<p class="discussion">The &quot;element&quot; parameter specifies which value to get from 0 to
 <code>ippGetCount(attr)</code> - 1.
 
 </p>
@@ -6077,7 +9321,7 @@ int ippGetBoolean(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, int elem
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Collection value or <code>NULL</code> on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<p class="discussion">The &quot;element&quot; parameter specifies which value to get from 0 to
 <code>ippGetCount(attr)</code> - 1.
 
 </p>
@@ -6106,10 +9350,21 @@ const <a href="#ipp_uchar_t">ipp_uchar_t</a> *ippGetDate(<a href="#ipp_attribute
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">dateTime value or <code>NULL</code></p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<p class="discussion">The &quot;element&quot; parameter specifies which value to get from 0 to
 <code>ippGetCount(attr)</code> - 1.
 
 </p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="ippGetFirstAttribute">ippGetFirstAttribute</a></h3>
+<p class="description">Return the first attribute in the message.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippGetFirstAttribute(<a href="#ipp_t">ipp_t</a> *ipp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ipp</th>
+<td class="description">IPP message</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">First attribute or <code>NULL</code> if none</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippGetGroupTag">ippGetGroupTag</a></h3>
 <p class="description">Get the group associated with an attribute.</p>
 <p class="code">
@@ -6135,21 +9390,43 @@ int ippGetInteger(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, int elem
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Value or 0 on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<p class="discussion">The &quot;element&quot; parameter specifies which value to get from 0 to
 <code>ippGetCount(attr)</code> - 1.
 
 </p>
+<h3 class="function"><a id="ippGetLength">ippGetLength</a></h3>
+<p class="description">Compute the length of an IPP message.</p>
+<p class="code">
+size_t ippGetLength(<a href="#ipp_t">ipp_t</a> *ipp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ipp</th>
+<td class="description">IPP message</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Size of IPP message</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippGetName">ippGetName</a></h3>
 <p class="description">Get the attribute name.</p>
 <p class="code">
-const char *ippGetName(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr);</p>
+const char *ippGetName(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>attr</th>
+<td class="description">IPP attribute</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Attribute name or <code>NULL</code> for separators</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="ippGetNextAttribute">ippGetNextAttribute</a></h3>
+<p class="description">Return the next attribute in the message.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippGetNextAttribute(<a href="#ipp_t">ipp_t</a> *ipp);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
-<tr><th>attr</th>
-<td class="description">IPP attribute</td></tr>
+<tr><th>ipp</th>
+<td class="description">IPP message</td></tr>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Attribute name or <code>NULL</code> for separators</p>
+<p class="description">Next attribute or <code>NULL</code> if none</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="ippGetOctetString">ippGetOctetString</a></h3>
 <p class="description">Get an octetString value from an IPP attribute.</p>
 <p class="code">
@@ -6166,14 +9443,14 @@ void *ippGetOctetString(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, in
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Pointer to octetString data</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<p class="discussion">The &quot;element&quot; parameter specifies which value to get from 0 to
 <code>ippGetCount(attr)</code> - 1.
 
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippGetOperation">ippGetOperation</a></h3>
 <p class="description">Get the operation ID in an IPP message.</p>
 <p class="code">
-ipp_op_t ippGetOperation(<a href="#ipp_t">ipp_t</a> *ipp);</p>
+<a href="#ipp_op_t">ipp_op_t</a> ippGetOperation(<a href="#ipp_t">ipp_t</a> *ipp);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ipp</th>
@@ -6181,6 +9458,12 @@ ipp_op_t ippGetOperation(<a href="#ipp_t">ipp_t</a> *ipp);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Operation ID or 0 on error</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="ippGetPort">ippGetPort</a></h3>
+<p class="description">Return the default IPP port number.</p>
+<p class="code">
+int ippGetPort(void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Port number</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippGetRange">ippGetRange</a></h3>
 <p class="description">Get a rangeOfInteger value from an attribute.</p>
 <p class="code">
@@ -6197,7 +9480,7 @@ int ippGetRange(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, int elemen
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Lower value of range or 0</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<p class="discussion">The &quot;element&quot; parameter specifies which value to get from 0 to
 <code>ippGetCount(attr)</code> - 1.
 
 </p>
@@ -6230,7 +9513,7 @@ int ippGetResolution(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, int e
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Horizontal/cross feed resolution or 0</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<p class="discussion">The &quot;element&quot; parameter specifies which value to get from 0 to
 <code>ippGetCount(attr)</code> - 1.
 
 </p>
@@ -6271,7 +9554,7 @@ const char *ippGetString(<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr, i
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Get the string and optionally the language code for an attribute.</p>
-<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<p class="discussion">The &quot;element&quot; parameter specifies which value to get from 0 to
 <code>ippGetCount(attr)</code> - 1.
 
 </p>
@@ -6299,17 +9582,6 @@ int ippGetVersion(<a href="#ipp_t">ipp_t</a> *ipp, int *minor);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Major version number or 0 on error</p>
-<h3 class="function"><a id="ippLength">ippLength</a></h3>
-<p class="description">Compute the length of an IPP message.</p>
-<p class="code">
-size_t ippLength(<a href="#ipp_t">ipp_t</a> *ipp);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>ipp</th>
-<td class="description">IPP message</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Size of IPP message</p>
 <h3 class="function"><a id="ippNew">ippNew</a></h3>
 <p class="description">Allocate a new IPP message.</p>
 <p class="code">
@@ -6319,7 +9591,7 @@ size_t ippLength(<a href="#ipp_t">ipp_t</a> *ipp);</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ippNewRequest">ippNewRequest</a></h3>
 <p class="description">Allocate a new IPP request message.</p>
 <p class="code">
-<a href="#ipp_t">ipp_t</a> *ippNewRequest(ipp_op_t op);</p>
+<a href="#ipp_t">ipp_t</a> *ippNewRequest(<a href="#ipp_op_t">ipp_op_t</a> op);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>op</th>
@@ -6353,21 +9625,10 @@ provided request message.  If the &quot;attributes-charset&quot; or
 respectively.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippNextAttribute">ippNextAttribute</a></h3>
-<p class="description">Return the next attribute in the message.</p>
-<p class="code">
-<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippNextAttribute(<a href="#ipp_t">ipp_t</a> *ipp);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>ipp</th>
-<td class="description">IPP message</td></tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Next attribute or <code>NULL</code> if none</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ippOpString">ippOpString</a></h3>
 <p class="description">Return a name for the given operation id.</p>
 <p class="code">
-const char *ippOpString(ipp_op_t op);</p>
+const char *ippOpString(<a href="#ipp_op_t">ipp_op_t</a> op);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>op</th>
@@ -6378,7 +9639,7 @@ const char *ippOpString(ipp_op_t op);</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ippOpValue">ippOpValue</a></h3>
 <p class="description">Return an operation id for the given name.</p>
 <p class="code">
-ipp_op_t ippOpValue(const char *name);</p>
+<a href="#ipp_op_t">ipp_op_t</a> ippOpValue(const char *name);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>name</th>
@@ -6386,12 +9647,6 @@ ipp_op_t ippOpValue(const char *name);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Operation ID</p>
-<h3 class="function"><a id="ippPort">ippPort</a></h3>
-<p class="description">Return the default IPP port number.</p>
-<p class="code">
-int ippPort(void);</p>
-<h4 class="returnvalue">Return Value</h4>
-<p class="description">Port number</p>
 <h3 class="function"><a id="ippRead">ippRead</a></h3>
 <p class="description">Read data for an IPP message from a HTTP connection.</p>
 <p class="code">
@@ -6421,7 +9676,7 @@ int ippPort(void);</p>
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ippReadIO">ippReadIO</a></h3>
 <p class="description">Read data for an IPP message.</p>
 <p class="code">
-<a href="#ipp_state_t">ipp_state_t</a> ippReadIO(void *src, <a href="#ipp_iocb_t">ipp_iocb_t</a> cb, int blocking, <a href="#ipp_t">ipp_t</a> *parent, <a href="#ipp_t">ipp_t</a> *ipp);</p>
+<a href="#ipp_state_t">ipp_state_t</a> ippReadIO(void *src, <a href="#ipp_io_cb_t">ipp_io_cb_t</a> cb, int blocking, <a href="#ipp_t">ipp_t</a> *parent, <a href="#ipp_t">ipp_t</a> *ipp);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>src</th>
@@ -6437,6 +9692,24 @@ int ippPort(void);</p>
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Current state</p>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="ippRestore">ippRestore</a></h3>
+<p class="description">Restore a previously saved find position.</p>
+<p class="code">
+void ippRestore(<a href="#ipp_t">ipp_t</a> *ipp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ipp</th>
+<td class="description">IPP message</td></tr>
+</tbody></table>
+<h3 class="function"><span class="info">&#160;CUPS 2.5&#160;</span><a id="ippSave">ippSave</a></h3>
+<p class="description">Save the current find position.</p>
+<p class="code">
+void ippSave(<a href="#ipp_t">ipp_t</a> *ipp);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ipp</th>
+<td class="description">IPP message</td></tr>
+</tbody></table>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippSetBoolean">ippSetBoolean</a></h3>
 <p class="description">Set a boolean value in an attribute.</p>
 <p class="code">
@@ -6455,12 +9728,12 @@ int ippSetBoolean(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">ip
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.
 
 </p>
@@ -6482,12 +9755,12 @@ int ippSetCollection(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t"
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.
 
 </p>
@@ -6509,12 +9782,12 @@ int ippSetDate(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">ipp_a
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.
 
 </p>
@@ -6534,12 +9807,12 @@ int ippSetGroupTag(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">i
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>group</code> parameter specifies the IPP attribute group tag: none
+The &quot;group&quot; parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
 event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 (<code>IPP_TAG_OPERATION</code>), printer (<code>IPP_TAG_PRINTER</code>), subscription
@@ -6564,12 +9837,12 @@ int ippSetInteger(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">ip
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.
 
 </p>
@@ -6589,10 +9862,10 @@ int ippSetName(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">ipp_a
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.
+The &quot;attr&quot; parameter may be modified as a result of setting the value.
 
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="ippSetOctetString">ippSetOctetString</a></h3>
@@ -6615,19 +9888,19 @@ int ippSetOctetString(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.
 
 </p>
 <h3 class="function"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="ippSetOperation">ippSetOperation</a></h3>
 <p class="description">Set the operation ID in an IPP request message.</p>
 <p class="code">
-int ippSetOperation(<a href="#ipp_t">ipp_t</a> *ipp, ipp_op_t op);</p>
+int ippSetOperation(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_op_t">ipp_op_t</a> op);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>ipp</th>
@@ -6638,7 +9911,7 @@ int ippSetOperation(<a href="#ipp_t">ipp_t</a> *ipp, ipp_op_t op);</p>
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.
 
 </p>
@@ -6671,12 +9944,12 @@ int ippSetRange(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">ipp_
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.
 
 </p>
@@ -6694,7 +9967,7 @@ int ippSetRequestId(<a href="#ipp_t">ipp_t</a> *ipp, int request_id);</p>
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>request_id</code> parameter must be greater than 0.
@@ -6722,12 +9995,12 @@ int ippSetResolution(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t"
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.
 
 </p>
@@ -6758,7 +10031,7 @@ int ippSetStatusCode(<a href="#ipp_t">ipp_t</a> *ipp, ipp_status_t status);</p>
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.
 
 </p>
@@ -6780,12 +10053,12 @@ int ippSetString(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">ipp
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.
 
 </p>
@@ -6809,15 +10082,15 @@ int ippSetStringf(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">ip
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.<br>
 <br>
-The <code>format</code> parameter uses formatting characters compatible with the
+The &quot;format&quot; parameter uses formatting characters compatible with the
 printf family of standard functions.  Additional arguments follow it as
 needed.  The formatted string is truncated as needed to the maximum length of
 the corresponding value type.
@@ -6843,15 +10116,15 @@ int ippSetStringfv(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">i
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
-The <code>element</code> parameter specifies which value to set from 0 to
+The &quot;element&quot; parameter specifies which value to set from 0 to
 <code>ippGetCount(attr)</code>.<br>
 <br>
-The <code>format</code> parameter uses formatting characters compatible with the
+The &quot;format&quot; parameter uses formatting characters compatible with the
 printf family of standard functions.  Additional arguments follow it as
 needed.  The formatted string is truncated as needed to the maximum length of
 the corresponding value type.
@@ -6873,18 +10146,18 @@ int ippSetValueTag(<a href="#ipp_t">ipp_t</a> *ipp, <a href="#ipp_attribute_t">i
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
-The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+The &quot;attr&quot; parameter may be modified as a result of setting the value.<br>
 <br>
 Integer (<code>IPP_TAG_INTEGER</code>) values can be promoted to rangeOfInteger
 (<code>IPP_TAG_RANGE</code>) values, the various string tags can be promoted to name
 (<code>IPP_TAG_NAME</code>) or nameWithLanguage (<code>IPP_TAG_NAMELANG</code>) values, text
 (<code>IPP_TAG_TEXT</code>) values can be promoted to textWithLanguage
 (<code>IPP_TAG_TEXTLANG</code>) values, and all values can be demoted to the various
-out-of-band value tags such as no-value (<code>IPP_TAG_NOVALUE</code>). All other changes
-will be rejected.<br>
+out-of-band value tags such as no-value (<code>IPP_TAG_NOVALUE</code>). All other
+changes will be rejected.<br>
 <br>
 Promoting a string attribute to nameWithLanguage or textWithLanguage adds the language
 code in the &quot;attributes-natural-language&quot; attribute or, if not present, the language
@@ -6907,7 +10180,7 @@ int ippSetVersion(<a href="#ipp_t">ipp_t</a> *ipp, int major, int minor);</p>
 <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 <code>ipp</code> parameter refers to an IPP message previously created using
+<p class="discussion">The &quot;ipp&quot; parameter refers to an IPP message previously created using
 the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2.
@@ -7028,7 +10301,7 @@ set to a human-readable message on failure.
 <h3 class="function"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span><a id="ippWriteIO">ippWriteIO</a></h3>
 <p class="description">Write data for an IPP message.</p>
 <p class="code">
-<a href="#ipp_state_t">ipp_state_t</a> ippWriteIO(void *dst, <a href="#ipp_iocb_t">ipp_iocb_t</a> cb, int blocking, <a href="#ipp_t">ipp_t</a> *parent, <a href="#ipp_t">ipp_t</a> *ipp);</p>
+<a href="#ipp_state_t">ipp_state_t</a> ippWriteIO(void *dst, <a href="#ipp_io_cb_t">ipp_io_cb_t</a> cb, int blocking, <a href="#ipp_t">ipp_t</a> *parent, <a href="#ipp_t">ipp_t</a> *ipp);</p>
 <h4 class="parameters">Parameters</h4>
 <table class="list"><tbody>
 <tr><th>dst</th>
@@ -7044,31 +10317,177 @@ set to a human-readable message on failure.
 </tbody></table>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Current state</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="pwgFormatSizeName">pwgFormatSizeName</a></h3>
+<p class="description">Generate a PWG self-describing media size name.</p>
+<p class="code">
+int pwgFormatSizeName(char *keyword, size_t keysize, const char *prefix, const char *name, int width, int length, const char *units);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>keyword</th>
+<td class="description">Keyword buffer</td></tr>
+<tr><th>keysize</th>
+<td class="description">Size of keyword buffer</td></tr>
+<tr><th>prefix</th>
+<td class="description">Prefix for PWG size or <code>NULL</code> for automatic</td></tr>
+<tr><th>name</th>
+<td class="description">Size name or <code>NULL</code></td></tr>
+<tr><th>width</th>
+<td class="description">Width of page in 2540ths</td></tr>
+<tr><th>length</th>
+<td class="description">Length of page in 2540ths</td></tr>
+<tr><th>units</th>
+<td class="description">Units - &quot;in&quot;, &quot;mm&quot;, or <code>NULL</code> for automatic</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function generates a PWG self-describing media size name of the form
+&quot;prefix_name_WIDTHxLENGTHunits&quot;.  The prefix is typically &quot;custom&quot; or &quot;roll&quot;
+for user-supplied sizes but can also be &quot;disc&quot;, &quot;iso&quot;, &quot;jis&quot;, &quot;jpn&quot;, &quot;na&quot;,
+&quot;oe&quot;, &quot;om&quot;, &quot;prc&quot;, or &quot;roc&quot;.  A value of <code>NULL</code> automatically chooses
+&quot;oe&quot; or &quot;om&quot; depending on the units.<br>
+<br>
+The size name may only contain lowercase letters, numbers, &quot;-&quot;, and &quot;.&quot;.  If
+<code>NULL</code> is passed, the size name will contain the formatted dimensions.<br>
+<br>
+The width and length are specified in hundredths of millimeters, equivalent
+to 1/100000th of a meter or 1/2540th of an inch.  The width, length, and
+units used for the generated size name are calculated automatically if the
+units string is <code>NULL</code>, otherwise inches (&quot;in&quot;) or millimeters (&quot;mm&quot;)
+are used.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="pwgInitSize">pwgInitSize</a></h3>
+<p class="description">Initialize a pwg_size_t structure using IPP Job Template
+                  attributes.</p>
+<p class="code">
+int pwgInitSize(<a href="#pwg_size_t">pwg_size_t</a> *size, <a href="#ipp_t">ipp_t</a> *job, int *margins_set);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>size</th>
+<td class="description">Size to initialize</td></tr>
+<tr><th>job</th>
+<td class="description">Job template attributes</td></tr>
+<tr><th>margins_set</th>
+<td class="description">1 if margins were set, 0 otherwise</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if size was initialized, 0 otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function initializes a pwg_size_t structure from an IPP &quot;media&quot; or
+&quot;media-col&quot; attribute in the specified IPP message.  0 is returned if neither
+attribute is found in the message or the values are not valid.<br>
+<br>
+The &quot;margins_set&quot; variable is initialized to 1 if any &quot;media-xxx-margin&quot;
+member attribute was specified in the &quot;media-col&quot; Job Template attribute,
+otherwise it is initialized to 0.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="pwgMediaForLegacy">pwgMediaForLegacy</a></h3>
+<p class="description">Find a PWG media size by ISO/IPP legacy name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForLegacy(const char *legacy);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>legacy</th>
+<td class="description">Legacy size name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;name&quot; argument specifies the legacy ISO media size name, for example
+&quot;iso-a4&quot; or &quot;na-letter&quot;.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="pwgMediaForPPD">pwgMediaForPPD</a></h3>
+<p class="description">Find a PWG media size by Adobe PPD name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForPPD(const char *ppd);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>ppd</th>
+<td class="description">PPD size name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;ppd&quot; argument specifies an Adobe page size name as defined in Table B.1
+of the Adobe PostScript Printer Description File Format Specification Version
+4.3.<br>
+<br>
+If the name is non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread.  Custom names can be of the form &quot;Custom.WIDTHxLENGTH[units]&quot; or
+&quot;WIDTHxLENGTH[units]&quot;.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="pwgMediaForPWG">pwgMediaForPWG</a></h3>
+<p class="description">Find a PWG media size by 5101.1 self-describing name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForPWG(const char *pwg);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>pwg</th>
+<td class="description">PWG size name</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;pwg&quot; argument specifies a self-describing media size name of the form
+&quot;prefix_name_WIDTHxLENGTHunits&quot; as defined in PWG 5101.1.<br>
+<br>
+If the name is non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread.
+
+</p>
+<h3 class="function"><span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span><a id="pwgMediaForSize">pwgMediaForSize</a></h3>
+<p class="description">Get the PWG media size for the given dimensions.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForSize(int width, int length);</p>
+<h4 class="parameters">Parameters</h4>
+<table class="list"><tbody>
+<tr><th>width</th>
+<td class="description">Width in hundredths of millimeters</td></tr>
+<tr><th>length</th>
+<td class="description">Length in hundredths of millimeters</td></tr>
+</tbody></table>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">PWG media name</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;width&quot; and &quot;length&quot; are in hundredths of millimeters, equivalent to
+1/100000th of a meter or 1/2540th of an inch.<br>
+<br>
+If the dimensions are non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread.
+
+</p>
 <h2 class="title"><a id="TYPES">Data Types</a></h2>
-<h3 class="typedef"><a id="cups_acopy_func_t">cups_acopy_func_t</a></h3>
+<h3 class="typedef"><a id="cups_acopy_cb_t">cups_acopy_cb_t</a></h3>
 <p class="description">Array element copy function</p>
 <p class="code">
-typedef void *(*)(void *element, void *data)cups_acopy_func_t;
+typedef void *(*)(void *element, void *data)cups_acopy_cb_t;
 </p>
 <h3 class="typedef"><a id="cups_adv_t">cups_adv_t</a></h3>
 <p class="description">AdvanceMedia attribute values</p>
 <p class="code">
 typedef enum <a href="#cups_adv_e">cups_adv_e</a> cups_adv_t;
 </p>
-<h3 class="typedef"><a id="cups_afree_func_t">cups_afree_func_t</a></h3>
+<h3 class="typedef"><a id="cups_afree_cb_t">cups_afree_cb_t</a></h3>
 <p class="description">Array element free function</p>
 <p class="code">
-typedef void(*)(void *element, void *data)cups_afree_func_t;
+typedef void(*)(void *element, void *data)cups_afree_cb_t;
 </p>
-<h3 class="typedef"><a id="cups_ahash_func_t">cups_ahash_func_t</a></h3>
+<h3 class="typedef"><a id="cups_ahash_cb_t">cups_ahash_cb_t</a></h3>
 <p class="description">Array hash function</p>
 <p class="code">
-typedef int(*)(void *element, void *data)cups_ahash_func_t;
+typedef int(*)(void *element, void *data)cups_ahash_cb_t;
 </p>
-<h3 class="typedef"><a id="cups_array_func_t">cups_array_func_t</a></h3>
+<h3 class="typedef"><a id="cups_array_cb_t">cups_array_cb_t</a></h3>
 <p class="description">Array comparison function</p>
 <p class="code">
-typedef int(*)(void *first, void *second, void *data)cups_array_func_t;
+typedef int(*)(void *first, void *second, void *data)cups_array_cb_t;
 </p>
 <h3 class="typedef"><a id="cups_array_t">cups_array_t</a></h3>
 <p class="description">CUPS array type</p>
@@ -7080,12 +10499,36 @@ typedef struct _cups_array_s cups_array_t;
 <p class="code">
 typedef enum <a href="#cups_bool_e">cups_bool_e</a> cups_bool_t;
 </p>
-<h3 class="typedef"><a id="cups_client_cert_cb_t"><span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span>cups_client_cert_cb_t</a></h3>
-<p class="description">Client credentials callback
+<h3 class="typedef"><a id="cups_cert_san_cb_t">cups_cert_san_cb_t</a></h3>
+<p class="description">Certificate signing subjectAltName callback</p>
+<p class="code">
+typedef bool(*)(const char *common_name, const char *subject_alt_name, void *user_data)cups_cert_san_cb_t;
 </p>
+<h3 class="typedef"><a id="cups_client_cert_cb_t"><span class="info">&#160;DEPRECATED&#160;</span>cups_client_cert_cb_t</a></h3>
+<p class="description">Client credentials callback </p>
 <p class="code">
 typedef int(*)(http_t *http, void *tls, <a href="#cups_array_t">cups_array_t</a> *distinguished_names, void *user_data)cups_client_cert_cb_t;
 </p>
+<h3 class="typedef"><a id="cups_cond_t">cups_cond_t</a></h3>
+<p class="description">Condition variable</p>
+<p class="code">
+typedef pthread_cond_t cups_cond_t;
+</p>
+<h3 class="typedef"><a id="cups_credpurpose_t">cups_credpurpose_t</a></h3>
+<p class="description">Combined X.509 credential purposes for <a href="#cupsCreateCredentials"><code>cupsCreateCredentials</code></a> and <a href="#cupsCreateCredentialsRequest"><code>cupsCreateCredentialsRequest</code></a></p>
+<p class="code">
+typedef unsigned cups_credpurpose_t;
+</p>
+<h3 class="typedef"><a id="cups_credtype_t">cups_credtype_t</a></h3>
+<p class="description">X.509 credential types for <a href="#cupsCreateCredentials"><code>cupsCreateCredentials</code></a> and <a href="#cupsCreateCredentialsRequest"><code>cupsCreateCredentialsRequest</code></a></p>
+<p class="code">
+typedef enum <a href="#cups_credtype_e">cups_credtype_e</a> cups_credtype_t;
+</p>
+<h3 class="typedef"><a id="cups_credusage_t">cups_credusage_t</a></h3>
+<p class="description">Combined X.509 keyUsage flags for <a href="#cupsCreateCredentials"><code>cupsCreateCredentials</code></a> and <a href="#cupsCreateCredentialsRequest"><code>cupsCreateCredentialsRequest</code></a></p>
+<p class="code">
+typedef unsigned cups_credusage_t;
+</p>
 <h3 class="typedef"><a id="cups_cspace_t">cups_cspace_t</a></h3>
 <p class="description">cupsColorSpace attribute values</p>
 <p class="code">
@@ -7096,25 +10539,33 @@ typedef enum <a href="#cups_cspace_e">cups_cspace_e</a> cups_cspace_t;
 <p class="code">
 typedef enum <a href="#cups_cut_e">cups_cut_e</a> cups_cut_t;
 </p>
+<h3 class="typedef"><a id="cups_dbcs_t">cups_dbcs_t</a></h3>
+<p class="description">DBCS Legacy 16-bit unit</p>
+<p class="code">
+typedef unsigned short cups_dbcs_t;
+</p>
 <h3 class="typedef"><a id="cups_dentry_t">cups_dentry_t</a></h3>
 <p class="description">Directory entry type</p>
 <p class="code">
 typedef struct <a href="#cups_dentry_s">cups_dentry_s</a> cups_dentry_t;
 </p>
 <h3 class="typedef"><a id="cups_dest_cb_t"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span>cups_dest_cb_t</a></h3>
-<p class="description">Destination enumeration callback
-</p>
+<p class="description">Destination enumeration callback </p>
 <p class="code">
 typedef int(*)(void *user_data, unsigned flags, <a href="#cups_dest_t">cups_dest_t</a> *dest)cups_dest_cb_t;
 </p>
+<h3 class="typedef"><a id="cups_dest_flags_t">cups_dest_flags_t</a></h3>
+<p class="description">Combined flags for <a href="#cupsConnectDest"><code>cupsConnectDest</code></a> and <a href="#cupsEnumDests"><code>cupsEnumDests</code></a></p>
+<p class="code">
+typedef unsigned cups_dest_flags_t;
+</p>
 <h3 class="typedef"><a id="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"><a id="cups_dinfo_t"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span>cups_dinfo_t</a></h3>
-<p class="description">Destination capability and status
-information </p>
+<p class="description">Destination capability and status information </p>
 <p class="code">
 typedef struct _cups_dinfo_s cups_dinfo_t;
 </p>
@@ -7123,6 +10574,61 @@ typedef struct _cups_dinfo_s cups_dinfo_t;
 <p class="code">
 typedef struct _cups_dir_s cups_dir_t;
 </p>
+<h3 class="typedef"><a id="cups_dnssd_browse_cb_t">cups_dnssd_browse_cb_t</a></h3>
+<p class="description">DNS-SD browse callback</p>
+<p class="code">
+typedef void(*)(cups_dnssd_browse_t *browse, void *cb_data, <a href="#cups_dnssd_flags_t">cups_dnssd_flags_t</a> flags, uint32_t if_index, const char *name, const char *regtype, const char *domain)cups_dnssd_browse_cb_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_error_cb_t">cups_dnssd_error_cb_t</a></h3>
+<p class="description">DNS-SD error callback</p>
+<p class="code">
+typedef void(*)(void *cb_data, const char *message)cups_dnssd_error_cb_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_flags_t">cups_dnssd_flags_t</a></h3>
+<p class="description">DNS-SD callback flag bitmask</p>
+<p class="code">
+typedef unsigned cups_dnssd_flags_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_query_cb_t">cups_dnssd_query_cb_t</a></h3>
+<p class="description">DNS-SD query callback</p>
+<p class="code">
+typedef void(*)(cups_dnssd_query_t *query, void *cb_data, <a href="#cups_dnssd_flags_t">cups_dnssd_flags_t</a> flags, uint32_t if_index, const char *fullname, uint16_t rrtype, const void *qdata, uint16_t qlen) cups_dnssd_query_cb_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_query_t">cups_dnssd_query_t</a></h3>
+<p class="description">DNS query request</p>
+<p class="code">
+typedef struct _cups_dnssd_query_s cups_dnssd_query_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_resolve_cb_t">cups_dnssd_resolve_cb_t</a></h3>
+<p class="description">DNS-SD resolve callback</p>
+<p class="code">
+typedef void(*)(cups_dnssd_resolve_t *res, void *cb_data, <a href="#cups_dnssd_flags_t">cups_dnssd_flags_t</a> flags, uint32_t if_index, const char *fullname, const char *host, uint16_t port, int num_txt, <a href="#cups_option_t">cups_option_t</a> *txt)cups_dnssd_resolve_cb_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_resolve_t">cups_dnssd_resolve_t</a></h3>
+<p class="description">DNS resolve request</p>
+<p class="code">
+typedef struct _cups_dnssd_resolve_s cups_dnssd_resolve_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_browse_t">cups_dnssd_browse_t</a></h3>
+<p class="description">DNS record type values</p>
+<p class="code">
+typedef typedef struct _cups_dnssd_browse_s cups_dnssd_browse_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_service_cb_t">cups_dnssd_service_cb_t</a></h3>
+<p class="description">DNS-SD service registration callback</p>
+<p class="code">
+typedef void(*)(cups_dnssd_service_t *service, void *cb_data, <a href="#cups_dnssd_flags_t">cups_dnssd_flags_t</a> flags) cups_dnssd_service_cb_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_service_t">cups_dnssd_service_t</a></h3>
+<p class="description">DNS service registration</p>
+<p class="code">
+typedef struct _cups_dnssd_service_s cups_dnssd_service_t;
+</p>
+<h3 class="typedef"><a id="cups_dnssd_t">cups_dnssd_t</a></h3>
+<p class="description">DNS-SD context</p>
+<p class="code">
+typedef struct _cups_dnssd_s cups_dnssd_t;
+</p>
 <h3 class="typedef"><a id="cups_edge_t">cups_edge_t</a></h3>
 <p class="description">LeadingEdge attribute values</p>
 <p class="code">
@@ -7134,7 +10640,7 @@ typedef enum <a href="#cups_edge_e">cups_edge_e</a> cups_edge_t;
 typedef struct _cups_file_s cups_file_t;
 </p>
 <h3 class="typedef"><a id="cups_job_t">cups_job_t</a></h3>
-<p class="description">Job</p>
+<p class="description">Job information</p>
 <p class="code">
 typedef struct <a href="#cups_job_s">cups_job_s</a> cups_job_t;
 </p>
@@ -7143,10 +10649,55 @@ typedef struct <a href="#cups_job_s">cups_job_s</a> cups_job_t;
 <p class="code">
 typedef enum <a href="#cups_jog_e">cups_jog_e</a> cups_jog_t;
 </p>
-<h3 class="typedef"><a id="cups_mode_t">cups_mode_t</a></h3>
-<p class="description">cupsRasterOpen modes</p>
+<h3 class="typedef"><a id="cups_json_t"><span class="info">&#160;CUPS 2.5&#160;</span>cups_json_t</a></h3>
+<p class="description">JSON node </p>
+<p class="code">
+typedef struct _cups_json_s cups_json_t;
+</p>
+<h3 class="typedef"><a id="cups_jtype_t"><span class="info">&#160;CUPS 2.5&#160;</span>cups_jtype_t</a></h3>
+<p class="description">JSON node type </p>
+<p class="code">
+typedef enum <a href="#cups_jtype_e">cups_jtype_e</a> cups_jtype_t;
+</p>
+<h3 class="typedef"><a id="cups_jwa_t"><span class="info">&#160;CUPS 2.5&#160;</span>cups_jwa_t</a></h3>
+<p class="description">JSON Web Algorithms </p>
+<p class="code">
+typedef enum <a href="#cups_jwa_e">cups_jwa_e</a> cups_jwa_t;
+</p>
+<h3 class="typedef"><a id="cups_jws_format_t"><span class="info">&#160;CUPS 2.5&#160;</span>cups_jws_format_t</a></h3>
+<p class="description">JSON Web Signature Formats </p>
+<p class="code">
+typedef enum <a href="#cups_jws_format_e">cups_jws_format_e</a> cups_jws_format_t;
+</p>
+<h3 class="typedef"><a id="cups_jwt_t"><span class="info">&#160;CUPS 2.5&#160;</span>cups_jwt_t</a></h3>
+<p class="description">JSON Web Token </p>
+<p class="code">
+typedef struct _cups_jwt_s cups_jwt_t;
+</p>
+<h3 class="typedef"><a id="cups_lang_t">cups_lang_t</a></h3>
+<p class="description">Language Cache Structure</p>
+<p class="code">
+typedef struct <a href="#cups_lang_s">cups_lang_s</a> cups_lang_t;
+</p>
+<h3 class="typedef"><a id="cups_media_flags_t">cups_media_flags_t</a></h3>
+<p class="description">Combined flags for <a href="#cupsGetDestMediaByName"><code>cupsGetDestMediaByName</code></a> and <a href="#cupsGetDestMediaBySize"><code>cupsGetDestMediaBySize</code></a></p>
+<p class="code">
+typedef unsigned cups_media_flags_t;
+</p>
+<h3 class="typedef"><a id="cups_media_t"><span class="info">&#160;CUPS 2.5&#160;</span>cups_media_t</a></h3>
+<p class="description">Media information </p>
+<p class="code">
+typedef struct <a href="#cups_media_s">cups_media_s</a> cups_media_t;
+</p>
+<h3 class="typedef"><a id="cups_mutex_t">cups_mutex_t</a></h3>
+<p class="description">Mutual exclusion lock</p>
 <p class="code">
-typedef enum <a href="#cups_mode_e">cups_mode_e</a> cups_mode_t;
+typedef pthread_mutex_t cups_mutex_t;
+</p>
+<h3 class="typedef"><a id="cups_oauth_cb_t"><span class="info">&#160;CUPS 2.4&#160;</span>cups_oauth_cb_t</a></h3>
+<p class="description">OAuth callback </p>
+<p class="code">
+typedef const char *(*)(http_t *http, const char *realm, const char *scope, const char *resource, void *user_data)cups_oauth_cb_t;
 </p>
 <h3 class="typedef"><a id="cups_option_t">cups_option_t</a></h3>
 <p class="description">Printer Options</p>
@@ -7174,44 +10725,99 @@ typedef struct <a href="#cups_page_header2_s">cups_page_header2_s</a> cups_page_
 typedef struct <a href="#cups_page_header_s">cups_page_header_s</a> cups_page_header_t;
 </p>
 <h3 class="typedef"><a id="cups_password_cb2_t"><span class="info">&#160;CUPS 1.4/macOS 10.6&#160;</span>cups_password_cb2_t</a></h3>
-<p class="description">New password callback
-</p>
+<p class="description">New password callback </p>
 <p class="code">
 typedef const char *(*)(const char *prompt, <a href="#http_t">http_t</a> *http, const char *method, const char *resource, void *user_data)cups_password_cb2_t;
 </p>
 <h3 class="typedef"><a id="cups_ptype_t">cups_ptype_t</a></h3>
-<p class="description">Printer type/capability bits</p>
+<p class="description">Combined printer type/capability flags</p>
 <p class="code">
 typedef unsigned cups_ptype_t;
 </p>
-<h3 class="typedef"><a id="cups_raster_iocb_t">cups_raster_iocb_t</a></h3>
+<h3 class="typedef"><a id="cups_raster_cb_t">cups_raster_cb_t</a></h3>
 <p class="description">cupsRasterOpenIO callback function</p>
 <p class="code">
-typedef ssize_t(*)(void *ctx, unsigned char *buffer, size_t length) cups_raster_iocb_t;
+typedef ssize_t(*)(void *ctx, unsigned char *buffer, size_t length) cups_raster_cb_t;
+</p>
+<h3 class="typedef"><a id="cups_raster_mode_t">cups_raster_mode_t</a></h3>
+<p class="description">cupsRasterOpen modes</p>
+<p class="code">
+typedef enum <a href="#cups_raster_mode_e">cups_raster_mode_e</a> cups_raster_mode_t;
 </p>
 <h3 class="typedef"><a id="cups_raster_t">cups_raster_t</a></h3>
 <p class="description">Raster stream data</p>
 <p class="code">
 typedef struct _cups_raster_s cups_raster_t;
 </p>
-<h3 class="typedef"><a id="cups_server_cert_cb_t"><span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span>cups_server_cert_cb_t</a></h3>
-<p class="description">Server credentials callback
+<h3 class="typedef"><a id="cups_rwlock_t">cups_rwlock_t</a></h3>
+<p class="description">Reader/writer lock</p>
+<p class="code">
+typedef pthread_rwlock_t cups_rwlock_t;
+</p>
+<h3 class="typedef"><a id="cups_sbcs_t">cups_sbcs_t</a></h3>
+<p class="description">SBCS Legacy 8-bit unit</p>
+<p class="code">
+typedef unsigned char cups_sbcs_t;
 </p>
+<h3 class="typedef"><a id="cups_server_cert_cb_t"><span class="info">&#160;DEPRECATED&#160;</span>cups_server_cert_cb_t</a></h3>
+<p class="description">Server credentials callback </p>
 <p class="code">
 typedef int(*)(http_t *http, void *tls, <a href="#cups_array_t">cups_array_t</a> *certs, void *user_data)cups_server_cert_cb_t;
 </p>
-<h3 class="typedef"><a id="cups_size_t"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span>cups_size_t</a></h3>
+<h3 class="typedef"><a id="cups_size_t"><span class="info">&#160;DEPRECATED&#160;</span>cups_size_t</a></h3>
 <p class="description">Media Size </p>
 <p class="code">
 typedef struct <a href="#cups_size_s">cups_size_s</a> cups_size_t;
 </p>
+<h3 class="typedef"><a id="cups_thread_func_t">cups_thread_func_t</a></h3>
+<p class="description">Thread function</p>
+<p class="code">
+typedef void *(*)(void *arg)cups_thread_func_t;
+</p>
+<h3 class="typedef"><a id="cups_thread_key_t">cups_thread_key_t</a></h3>
+<p class="description">Thread data key</p>
+<p class="code">
+typedef pthread_key_t cups_thread_key_t;
+</p>
+<h3 class="typedef"><a id="cups_thread_t">cups_thread_t</a></h3>
+<p class="description">Thread identifier</p>
+<p class="code">
+typedef pthread_t cups_thread_t;
+</p>
+<h3 class="typedef"><a id="cups_ucs2_t">cups_ucs2_t</a></h3>
+<p class="description">UCS-2 Unicode/ISO-10646 unit</p>
+<p class="code">
+typedef unsigned short cups_ucs2_t;
+</p>
+<h3 class="typedef"><a id="cups_ucs4_t">cups_ucs4_t</a></h3>
+<p class="description">UCS-4 Unicode/ISO-10646 unit</p>
+<p class="code">
+typedef unsigned long cups_ucs4_t;
+</p>
+<h3 class="typedef"><a id="cups_utf32_t">cups_utf32_t</a></h3>
+<p class="description">UTF-32 Unicode/ISO-10646 unit</p>
+<p class="code">
+typedef unsigned long cups_utf32_t;
+</p>
+<h3 class="typedef"><a id="cups_utf8_t">cups_utf8_t</a></h3>
+<p class="description">UTF-8 Unicode/ISO-10646 unit</p>
+<p class="code">
+typedef unsigned char cups_utf8_t;
+</p>
+<h3 class="typedef"><a id="cups_vbcs_t">cups_vbcs_t</a></h3>
+<p class="description">VBCS Legacy 32-bit unit</p>
+<p class="code">
+typedef unsigned long cups_vbcs_t;
+</p>
+<h3 class="typedef"><a id="cups_whichjobs_t">cups_whichjobs_t</a></h3>
+<p class="description">Which jobs for <a href="#cupsGetJobs"><code>cupsGetJobs</code></a></p>
+<p class="code">
+typedef enum <a href="#cups_whichjobs_e">cups_whichjobs_e</a> cups_whichjobs_t;
+</p>
 <h3 class="typedef"><a id="http_addr_t"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span>http_addr_t</a></h3>
-<p class="description">Socket address union, which
-makes using IPv6 and other
-address types easier and
-more portable. </p>
+<p class="description">Socket address union, which makes using IPv6 and other address types easier and more portable. </p>
 <p class="code">
-typedef union _http_addr_u http_addr_t;
+typedef union _http_addr_u http_addr_t;
 </p>
 <h3 class="typedef"><a id="http_encoding_t">http_encoding_t</a></h3>
 <p class="description">HTTP transfer encoding values</p>
@@ -7233,9 +10839,18 @@ typedef enum <a href="#http_field_e">http_field_e</a> http_field_t;
 <p class="code">
 typedef enum <a href="#http_keepalive_e">http_keepalive_e</a> http_keepalive_t;
 </p>
+<h3 class="typedef"><a id="http_resolve_cb_t"><span class="info">&#160;CUPS 2.5&#160;</span>http_resolve_cb_t</a></h3>
+<p class="description"><a href="#httpResolveURI"><code>httpResolveURI</code></a> callback </p>
+<p class="code">
+typedef bool(*)(void *data)http_resolve_cb_t;
+</p>
+<h3 class="typedef"><a id="http_resolve_t">http_resolve_t</a></h3>
+<p class="description"><a href="#httpResolveURI"><code>httpResolveURI</code></a> options bitfield</p>
+<p class="code">
+typedef unsigned http_resolve_t;
+</p>
 <h3 class="typedef"><a id="http_state_t">http_state_t</a></h3>
-<p class="description">HTTP state values; states
-are server-oriented...</p>
+<p class="description">HTTP state values; states are server-oriented...</p>
 <p class="code">
 typedef enum <a href="#http_state_e">http_state_e</a> http_state_t;
 </p>
@@ -7269,15 +10884,45 @@ typedef enum <a href="#http_uri_status_e">http_uri_status_e</a> http_uri_status_
 <p class="code">
 typedef struct _ipp_attribute_s ipp_attribute_t;
 </p>
-<h3 class="typedef"><a id="ipp_copycb_t"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span>ipp_copycb_t</a></h3>
+<h3 class="typedef"><a id="ipp_copy_cb_t"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span>ipp_copy_cb_t</a></h3>
 <p class="description">ippCopyAttributes callback function </p>
 <p class="code">
-typedef int(*)(void *context, <a href="#ipp_t">ipp_t</a> *dst, <a href="#ipp_attribute_t">ipp_attribute_t</a> *attr)ipp_copycb_t;
+typedef int(*)(void *context, <a href="#ipp_t">ipp_t</a> *dst, <a href="#ipp_attribute_t">ipp_attribute_t</a> *attr)ipp_copy_cb_t;
+</p>
+<h3 class="typedef"><a id="ipp_fattr_cb_t">ipp_fattr_cb_t</a></h3>
+<p class="description">IPP data file attribute callback</p>
+<p class="code">
+typedef bool(*)(ipp_file_t *file, void *cb_data, const char *name)ipp_fattr_cb_t;
+</p>
+<h3 class="typedef"><a id="ipp_ferror_cb_t">ipp_ferror_cb_t</a></h3>
+<p class="description">IPP data file error callback</p>
+<p class="code">
+typedef bool(*)(ipp_file_t *file, void *cb_data, const char *error)ipp_ferror_cb_t;
+</p>
+<h3 class="typedef"><a id="ipp_file_t">ipp_file_t</a></h3>
+<p class="description">IPP data file</p>
+<p class="code">
+typedef struct _ipp_file_s ipp_file_t;
+</p>
+<h3 class="typedef"><a id="ipp_ftoken_cb_t">ipp_ftoken_cb_t</a></h3>
+<p class="description">IPP data file token callback</p>
+<p class="code">
+typedef bool(*)(ipp_file_t *file, void *cb_data, const char *token)ipp_ftoken_cb_t;
 </p>
-<h3 class="typedef"><a id="ipp_iocb_t"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span>ipp_iocb_t</a></h3>
+<h3 class="typedef"><a id="ipp_io_cb_t"><span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span>ipp_io_cb_t</a></h3>
 <p class="description">ippReadIO/ippWriteIO callback function </p>
 <p class="code">
-typedef ssize_t(*)(void *context, ipp_uchar_t *buffer, size_t bytes) ipp_iocb_t;
+typedef ssize_t(*)(void *context, ipp_uchar_t *buffer, size_t bytes) ipp_io_cb_t;
+</p>
+<h3 class="typedef"><a id="ipp_jstate_t">ipp_jstate_t</a></h3>
+<p class="description">Job states</p>
+<p class="code">
+typedef enum <a href="#ipp_jstate_e">ipp_jstate_e</a> ipp_jstate_t;
+</p>
+<h3 class="typedef"><a id="ipp_op_t">ipp_op_t</a></h3>
+<p class="description">IPP operations</p>
+<p class="code">
+typedef enum <a href="#ipp_op_e">ipp_op_e</a> ipp_op_t;
 </p>
 <h3 class="typedef"><a id="ipp_orient_t">ipp_orient_t</a></h3>
 <p class="description">Orientation values</p>
@@ -7349,7 +10994,7 @@ typedef struct <a href="#pwg_media_s">pwg_media_s</a> pwg_media_t;
 <h4 class="members">Members</h4>
 <table class="list"><tbody>
 <tr><th>instance </th>
-<td class="description">Local instance name or NULL</td></tr>
+<td class="description">Local instance name or <code>NULL</code></td></tr>
 <tr><th>is_default </th>
 <td class="description">Is this printer the default?</td></tr>
 <tr><th>num_options </th>
@@ -7358,7 +11003,7 @@ typedef struct <a href="#pwg_media_s">pwg_media_s</a> pwg_media_t;
 <td class="description">Options</td></tr>
 </tbody></table>
 <h3 class="struct"><a id="cups_job_s">cups_job_s</a></h3>
-<p class="description">Job</p>
+<p class="description">Job information</p>
 <p class="code">struct cups_job_s {<br>
 &#160;&#160;&#160;&#160;time_t completed_time;<br>
 &#160;&#160;&#160;&#160;time_t creation_time;<br>
@@ -7368,7 +11013,7 @@ typedef struct <a href="#pwg_media_s">pwg_media_s</a> pwg_media_t;
 &#160;&#160;&#160;&#160;int priority;<br>
 &#160;&#160;&#160;&#160;time_t processing_time;<br>
 &#160;&#160;&#160;&#160;int size;<br>
-&#160;&#160;&#160;&#160;ipp_jstate_t state;<br>
+&#160;&#160;&#160;&#160;<a href="#ipp_jstate_t">ipp_jstate_t</a> state;<br>
 &#160;&#160;&#160;&#160;char *title;<br>
 &#160;&#160;&#160;&#160;char *user;<br>
 };</p>
@@ -7397,6 +11042,38 @@ typedef struct <a href="#pwg_media_s">pwg_media_s</a> pwg_media_t;
 <tr><th>user </th>
 <td class="description">User that submitted the job</td></tr>
 </tbody></table>
+<h3 class="struct"><a id="cups_lang_s">cups_lang_s</a></h3>
+<p class="description">Language Cache Structure</p>
+<p class="code">struct cups_lang_s {<br>
+&#160;&#160;&#160;&#160;<a href="#cups_encoding_t">cups_encoding_t</a> encoding;<br>
+&#160;&#160;&#160;&#160;char language[16];<br>
+&#160;&#160;&#160;&#160;struct <a href="#cups_lang_s">cups_lang_s</a> *next;<br>
+&#160;&#160;&#160;&#160;int used;<br>
+};</p>
+<h4 class="members">Members</h4>
+<table class="list"><tbody>
+<tr><th>encoding </th>
+<td class="description">Text encoding</td></tr>
+<tr><th>language[16] </th>
+<td class="description">Language/locale name</td></tr>
+<tr><th>next </th>
+<td class="description">Next language in cache</td></tr>
+<tr><th>used </th>
+<td class="description">Number of times this entry has been used.</td></tr>
+</tbody></table>
+<h3 class="struct"><span class="info">&#160;CUPS 2.5&#160;</span><a id="cups_media_s">cups_media_s</a></h3>
+<p class="description">Media information </p>
+<p class="code">struct cups_media_s {<br>
+&#160;&#160;&#160;&#160;int width, length, bottom, left, right, top;<br>
+&#160;&#160;&#160;&#160;char media[128], color[128], source[128], type[128];<br>
+};</p>
+<h4 class="members">Members</h4>
+<table class="list"><tbody>
+<tr><th>top </th>
+<td class="description">Top margin in hundredths of millimeters</td></tr>
+<tr><th>type[128] </th>
+<td class="description">Media type (blank for any/auto)</td></tr>
+</tbody></table>
 <h3 class="struct"><a id="cups_option_s">cups_option_s</a></h3>
 <p class="description">Printer Options</p>
 <p class="code">struct cups_option_s {<br>
@@ -7691,7 +11368,7 @@ factor not applied) </td></tr>
 <tr><th>cupsWidth </th>
 <td class="description">Width of page image in pixels</td></tr>
 </tbody></table>
-<h3 class="struct"><span class="info">&#160;CUPS 1.6/macOS 10.8&#160;</span><a id="cups_size_s">cups_size_s</a></h3>
+<h3 class="struct"><span class="info">&#160;DEPRECATED&#160;</span><a id="cups_size_s">cups_size_s</a></h3>
 <p class="description">Media Size </p>
 <p class="code">struct cups_size_s {<br>
 &#160;&#160;&#160;&#160;char media[128];<br>
@@ -7702,8 +11379,7 @@ factor not applied) </td></tr>
 <tr><th>media[128] </th>
 <td class="description">Media name to use</td></tr>
 <tr><th>top </th>
-<td class="description">Top margin in hundredths of
-millimeters</td></tr>
+<td class="description">Top margin in hundredths of millimeters</td></tr>
 </tbody></table>
 <h3 class="struct"><a id="pwg_media_s">pwg_media_s</a></h3>
 <p class="description">Common media size data</p>
@@ -7736,6 +11412,47 @@ millimeters</td></tr>
 <tr><th>CUPS_FALSE </th><td class="description">Logical false</td></tr>
 <tr><th>CUPS_TRUE </th><td class="description">Logical true</td></tr>
 </tbody></table>
+<h3 class="enumeration"><a id="cups_credpurpose_e">cups_credpurpose_e</a></h3>
+<p class="description">X.509 credential purposes</p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_CREDPURPOSE_ALL </th><td class="description">All purposes</td></tr>
+<tr><th>CUPS_CREDPURPOSE_CLIENT_AUTH </th><td class="description">clientAuth</td></tr>
+<tr><th>CUPS_CREDPURPOSE_CODE_SIGNING </th><td class="description">codeSigning</td></tr>
+<tr><th>CUPS_CREDPURPOSE_EMAIL_PROTECTION </th><td class="description">emailProtection</td></tr>
+<tr><th>CUPS_CREDPURPOSE_OCSP_SIGNING </th><td class="description">OCSPSigning</td></tr>
+<tr><th>CUPS_CREDPURPOSE_SERVER_AUTH </th><td class="description">serverAuth</td></tr>
+<tr><th>CUPS_CREDPURPOSE_TIME_STAMPING </th><td class="description">timeStamping</td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_credtype_e">cups_credtype_e</a></h3>
+<p class="description">X.509 credential types for <a href="#cupsCreateCredentials"><code>cupsCreateCredentials</code></a> and <a href="#cupsCreateCredentialsRequest"><code>cupsCreateCredentialsRequest</code></a></p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_CREDTYPE_DEFAULT </th><td class="description">Default type</td></tr>
+<tr><th>CUPS_CREDTYPE_ECDSA_P256_SHA256 </th><td class="description">ECDSA using the P-256 curve with SHA-256 hash</td></tr>
+<tr><th>CUPS_CREDTYPE_ECDSA_P384_SHA256 </th><td class="description">ECDSA using the P-384 curve with SHA-256 hash</td></tr>
+<tr><th>CUPS_CREDTYPE_ECDSA_P521_SHA256 </th><td class="description">ECDSA using the P-521 curve with SHA-256 hash</td></tr>
+<tr><th>CUPS_CREDTYPE_RSA_2048_SHA256 </th><td class="description">RSA with 2048-bit keys and SHA-256 hash</td></tr>
+<tr><th>CUPS_CREDTYPE_RSA_3072_SHA256 </th><td class="description">RSA with 3072-bit keys and SHA-256 hash</td></tr>
+<tr><th>CUPS_CREDTYPE_RSA_4096_SHA256 </th><td class="description">RSA with 4096-bit keys and SHA-256 hash</td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_credusage_e">cups_credusage_e</a></h3>
+<p class="description">X.509 keyUsage flags</p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_CREDUSAGE_ALL </th><td class="description">All keyUsage flags</td></tr>
+<tr><th>CUPS_CREDUSAGE_CRL_SIGN </th><td class="description">cRLSign</td></tr>
+<tr><th>CUPS_CREDUSAGE_DATA_ENCIPHERMENT </th><td class="description">dataEncipherment</td></tr>
+<tr><th>CUPS_CREDUSAGE_DECIPHER_ONLY </th><td class="description">decipherOnly</td></tr>
+<tr><th>CUPS_CREDUSAGE_DEFAULT_CA </th><td class="description">Defaults for CA certs</td></tr>
+<tr><th>CUPS_CREDUSAGE_DEFAULT_TLS </th><td class="description">Defaults for TLS certs</td></tr>
+<tr><th>CUPS_CREDUSAGE_DIGITAL_SIGNATURE </th><td class="description">digitalSignature</td></tr>
+<tr><th>CUPS_CREDUSAGE_ENCIPHER_ONLY </th><td class="description">encipherOnly</td></tr>
+<tr><th>CUPS_CREDUSAGE_KEY_AGREEMENT </th><td class="description">keyAgreement</td></tr>
+<tr><th>CUPS_CREDUSAGE_KEY_CERT_SIGN </th><td class="description">keyCertSign</td></tr>
+<tr><th>CUPS_CREDUSAGE_KEY_ENCIPHERMENT </th><td class="description">keyEncipherment</td></tr>
+<tr><th>CUPS_CREDUSAGE_NON_REPUDIATION </th><td class="description">nonRepudiation/contentCommitment</td></tr>
+</tbody></table>
 <h3 class="enumeration"><a id="cups_cspace_e">cups_cspace_e</a></h3>
 <p class="description">cupsColorSpace attribute values</p>
 <h4 class="constants">Constants</h4>
@@ -7802,6 +11519,56 @@ millimeters</td></tr>
 <tr><th>CUPS_CUT_PAGE </th><td class="description">Cut the roll after this page</td></tr>
 <tr><th>CUPS_CUT_SET </th><td class="description">Cut the roll after this set</td></tr>
 </tbody></table>
+<h3 class="enumeration"><a id="cups_dest_flags_e">cups_dest_flags_e</a></h3>
+<p class="description">Flags for <a href="#cupsConnectDest"><code>cupsConnectDest</code></a> and <a href="#cupsEnumDests"><code>cupsEnumDests</code></a></p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_DEST_FLAGS_CANCELED </th><td class="description">Operation was canceled</td></tr>
+<tr><th>CUPS_DEST_FLAGS_CONNECTING </th><td class="description">A connection is being established</td></tr>
+<tr><th>CUPS_DEST_FLAGS_DEVICE </th><td class="description">For <a href="#cupsConnectDest"><code>cupsConnectDest</code></a>: Connect to device</td></tr>
+<tr><th>CUPS_DEST_FLAGS_ERROR </th><td class="description">An error occurred</td></tr>
+<tr><th>CUPS_DEST_FLAGS_MORE </th><td class="description">There are more destinations</td></tr>
+<tr><th>CUPS_DEST_FLAGS_NONE </th><td class="description">No flags are set</td></tr>
+<tr><th>CUPS_DEST_FLAGS_REMOVED </th><td class="description">The destination has gone away</td></tr>
+<tr><th>CUPS_DEST_FLAGS_RESOLVING </th><td class="description">The destination address is being resolved</td></tr>
+<tr><th>CUPS_DEST_FLAGS_UNCONNECTED </th><td class="description">There is no connection</td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_dnssd_flags_e">cups_dnssd_flags_e</a></h3>
+<p class="description">DNS-SD callback flag values</p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_DNSSD_FLAGS_ADD </th><td class="description">Added (removed if not set)</td></tr>
+<tr><th>CUPS_DNSSD_FLAGS_COLLISION </th><td class="description">Collision occurred</td></tr>
+<tr><th>CUPS_DNSSD_FLAGS_ERROR </th><td class="description">Error occurred</td></tr>
+<tr><th>CUPS_DNSSD_FLAGS_HOST_CHANGE </th><td class="description">Host name changed</td></tr>
+<tr><th>CUPS_DNSSD_FLAGS_MORE </th><td class="description">More coming</td></tr>
+<tr><th>CUPS_DNSSD_FLAGS_NETWORK_CHANGE </th><td class="description">Network connection changed</td></tr>
+<tr><th>CUPS_DNSSD_FLAGS_NONE </th><td class="description">No flags</td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_dnssd_rrtype_e">cups_dnssd_rrtype_e</a></h3>
+<p class="description">DNS record type values</p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_DNSSD_RRTYPE_A </th><td class="description">Host address</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_AAAA </th><td class="description">IPv6 Address.</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_ANY </th><td class="description">Wildcard match</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_CERT </th><td class="description">Certification record</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_CNAME </th><td class="description">Canonical name</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_DHCID </th><td class="description">DHCP Client Identifier</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_DNSKEY </th><td class="description">DNSKEY</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_HTTPS </th><td class="description">HTTPS Service Binding</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_KEY </th><td class="description">Security key</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_KX </th><td class="description">Key Exchange</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_LOC </th><td class="description">Location Information.</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_NS </th><td class="description">Name server</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_PTR </th><td class="description">Domain name pointer</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_RRSIG </th><td class="description">RRSIG</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_RT </th><td class="description">Router</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_SIG </th><td class="description">Security signature</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_SPF </th><td class="description">Sender Policy Framework for E-Mail</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_TXT </th><td class="description">One or more text strings</td></tr>
+<tr><th>CUPS_DNSSD_RRTYPE_WKS </th><td class="description">Well known service</td></tr>
+</tbody></table>
 <h3 class="enumeration"><a id="cups_edge_e">cups_edge_e</a></h3>
 <p class="description">LeadingEdge attribute values</p>
 <h4 class="constants">Constants</h4>
@@ -7820,14 +11587,50 @@ millimeters</td></tr>
 <tr><th>CUPS_JOG_NONE </th><td class="description">Never move pages</td></tr>
 <tr><th>CUPS_JOG_SET </th><td class="description">Move pages after this set</td></tr>
 </tbody></table>
-<h3 class="enumeration"><a id="cups_mode_e">cups_mode_e</a></h3>
-<p class="description">cupsRasterOpen modes</p>
+<h3 class="enumeration"><a id="cups_jtype_e"><span class="info">&#160;CUPS 2.5&#160;</span>cups_jtype_e</a></h3>
+<p class="description">JSON node type </p>
 <h4 class="constants">Constants</h4>
 <table class="list"><tbody>
-<tr><th>CUPS_RASTER_READ </th><td class="description">Open stream for reading</td></tr>
-<tr><th>CUPS_RASTER_WRITE </th><td class="description">Open stream for writing</td></tr>
-<tr><th>CUPS_RASTER_WRITE_COMPRESSED <span class="info">&#160;CUPS 1.3/macOS 10.5&#160;</span></th><td class="description">Open stream for compressed writing </td></tr>
-<tr><th>CUPS_RASTER_WRITE_PWG <span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span></th><td class="description">Open stream for compressed writing in PWG Raster mode </td></tr>
+<tr><th>CUPS_JTYPE_ARRAY </th><td class="description">Array value</td></tr>
+<tr><th>CUPS_JTYPE_FALSE </th><td class="description">Boolean false value</td></tr>
+<tr><th>CUPS_JTYPE_KEY </th><td class="description">Object key (string)</td></tr>
+<tr><th>CUPS_JTYPE_NULL </th><td class="description">Null value</td></tr>
+<tr><th>CUPS_JTYPE_NUMBER </th><td class="description">Number value</td></tr>
+<tr><th>CUPS_JTYPE_OBJECT </th><td class="description">Object value</td></tr>
+<tr><th>CUPS_JTYPE_STRING </th><td class="description">String value</td></tr>
+<tr><th>CUPS_JTYPE_TRUE </th><td class="description">Boolean true value</td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_jwa_e"><span class="info">&#160;CUPS 2.5&#160;</span>cups_jwa_e</a></h3>
+<p class="description">JSON Web Algorithms </p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_JWA_ES256 </th><td class="description">ECDSA using P-256 and SHA-256</td></tr>
+<tr><th>CUPS_JWA_ES384 </th><td class="description">ECDSA using P-384 and SHA-384</td></tr>
+<tr><th>CUPS_JWA_ES512 </th><td class="description">ECDSA using P-521 and SHA-512</td></tr>
+<tr><th>CUPS_JWA_HS256 </th><td class="description">HMAC using SHA-256</td></tr>
+<tr><th>CUPS_JWA_HS384 </th><td class="description">HMAC using SHA-384</td></tr>
+<tr><th>CUPS_JWA_HS512 </th><td class="description">HMAC using SHA-512</td></tr>
+<tr><th>CUPS_JWA_NONE </th><td class="description">No algorithm</td></tr>
+<tr><th>CUPS_JWA_RS256 </th><td class="description">RSASSA-PKCS1-v1_5 using SHA-256</td></tr>
+<tr><th>CUPS_JWA_RS384 </th><td class="description">RSASSA-PKCS1-v1_5 using SHA-384</td></tr>
+<tr><th>CUPS_JWA_RS512 </th><td class="description">RSASSA-PKCS1-v1_5 using SHA-512</td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_jws_format_e"><span class="info">&#160;CUPS 2.5&#160;</span>cups_jws_format_e</a></h3>
+<p class="description">JSON Web Signature Formats </p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_JWS_FORMAT_COMPACT </th><td class="description">JWS Compact Serialization</td></tr>
+<tr><th>CUPS_JWS_FORMAT_JSON </th><td class="description">JWS JSON Serialization</td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_media_flags_e">cups_media_flags_e</a></h3>
+<p class="description">Flags for <a href="#cupsGetDestMediaByName"><code>cupsGetDestMediaByName</code></a> and <a href="#cupsGetDestMediaBySize"><code>cupsGetDestMediaBySize</code></a></p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_MEDIA_FLAGS_BORDERLESS </th><td class="description">Find a borderless size</td></tr>
+<tr><th>CUPS_MEDIA_FLAGS_DEFAULT </th><td class="description">Find the closest size supported by the printer</td></tr>
+<tr><th>CUPS_MEDIA_FLAGS_DUPLEX </th><td class="description">Find a size compatible with 2-sided printing</td></tr>
+<tr><th>CUPS_MEDIA_FLAGS_EXACT </th><td class="description">Find an exact match for the size</td></tr>
+<tr><th>CUPS_MEDIA_FLAGS_READY </th><td class="description">If the printer supports media sensing, find the size amongst the &quot;ready&quot; media.</td></tr>
 </tbody></table>
 <h3 class="enumeration"><a id="cups_order_e">cups_order_e</a></h3>
 <p class="description">cupsColorOrder attribute values</p>
@@ -7847,37 +11650,53 @@ millimeters</td></tr>
 <tr><th>CUPS_ORIENT_90 </th><td class="description">Rotate the page counter-clockwise</td></tr>
 </tbody></table>
 <h3 class="enumeration"><a id="cups_ptype_e">cups_ptype_e</a></h3>
-<p class="description">Printer type/capability bit
-constants</p>
+<p class="description">Printer type/capability flags</p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_PTYPE_AUTHENTICATED </th><td class="description">Printer requires authentication</td></tr>
+<tr><th>CUPS_PTYPE_BIND </th><td class="description">Can bind output</td></tr>
+<tr><th>CUPS_PTYPE_BW </th><td class="description">Can do B&amp;W printing</td></tr>
+<tr><th>CUPS_PTYPE_CLASS </th><td class="description">Printer class</td></tr>
+<tr><th>CUPS_PTYPE_COLLATE </th><td class="description">Can quickly collate copies</td></tr>
+<tr><th>CUPS_PTYPE_COLOR </th><td class="description">Can do color printing</td></tr>
+<tr><th>CUPS_PTYPE_COMMANDS </th><td class="description">Printer supports maintenance commands</td></tr>
+<tr><th>CUPS_PTYPE_COPIES </th><td class="description">Can do copies in hardware</td></tr>
+<tr><th>CUPS_PTYPE_COVER </th><td class="description">Can cover output</td></tr>
+<tr><th>CUPS_PTYPE_DEFAULT </th><td class="description">Default printer on network</td></tr>
+<tr><th>CUPS_PTYPE_DISCOVERED </th><td class="description">Printer was discovered</td></tr>
+<tr><th>CUPS_PTYPE_DUPLEX </th><td class="description">Can do two-sided printing</td></tr>
+<tr><th>CUPS_PTYPE_FAX </th><td class="description">Fax queue</td></tr>
+<tr><th>CUPS_PTYPE_FOLD <span class="info">&#160;CUPS 2.5&#160;</span></th><td class="description">Can fold output </td></tr>
+<tr><th>CUPS_PTYPE_LARGE </th><td class="description">Can print on D/E/A1/A0-size media</td></tr>
+<tr><th>CUPS_PTYPE_LOCAL </th><td class="description">Local printer or class</td></tr>
+<tr><th>CUPS_PTYPE_MEDIUM </th><td class="description">Can print on Tabloid/B/C/A3/A2-size media</td></tr>
+<tr><th>CUPS_PTYPE_MFP </th><td class="description">Printer with scanning capabilities</td></tr>
+<tr><th>CUPS_PTYPE_NOT_SHARED </th><td class="description">Printer is not shared</td></tr>
+<tr><th>CUPS_PTYPE_PUNCH </th><td class="description">Can punch output</td></tr>
+<tr><th>CUPS_PTYPE_REJECTING </th><td class="description">Printer is rejecting jobs</td></tr>
+<tr><th>CUPS_PTYPE_REMOTE </th><td class="description">Remote printer or class</td></tr>
+<tr><th>CUPS_PTYPE_SCANNER </th><td class="description">Scanner-only device</td></tr>
+<tr><th>CUPS_PTYPE_SMALL </th><td class="description">Can print on Letter/Legal/A4-size media</td></tr>
+<tr><th>CUPS_PTYPE_SORT </th><td class="description">Can sort output</td></tr>
+<tr><th>CUPS_PTYPE_STAPLE </th><td class="description">Can staple output</td></tr>
+<tr><th>CUPS_PTYPE_VARIABLE </th><td class="description">Can print on rolls and custom-size media</td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_raster_mode_e">cups_raster_mode_e</a></h3>
+<p class="description">cupsRasterOpen modes</p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>CUPS_RASTER_READ </th><td class="description">Open stream for reading</td></tr>
+<tr><th>CUPS_RASTER_WRITE </th><td class="description">Open stream for writing</td></tr>
+<tr><th>CUPS_RASTER_WRITE_COMPRESSED <span class="info">&#160;CUPS 1.3/macOS 10.5&#160;</span></th><td class="description">Open stream for compressed writing </td></tr>
+<tr><th>CUPS_RASTER_WRITE_PWG <span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span></th><td class="description">Open stream for compressed writing in PWG Raster mode </td></tr>
+</tbody></table>
+<h3 class="enumeration"><a id="cups_whichjobs_e">cups_whichjobs_e</a></h3>
+<p class="description">Which jobs for <a href="#cupsGetJobs"><code>cupsGetJobs</code></a></p>
 <h4 class="constants">Constants</h4>
 <table class="list"><tbody>
-<tr><th>CUPS_PRINTER_AUTHENTICATED <span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span></th><td class="description">Printer requires authentication
-</td></tr>
-<tr><th>CUPS_PRINTER_BIND </th><td class="description">Can bind output</td></tr>
-<tr><th>CUPS_PRINTER_BW </th><td class="description">Can do B&amp;W printing</td></tr>
-<tr><th>CUPS_PRINTER_CLASS </th><td class="description">Printer class</td></tr>
-<tr><th>CUPS_PRINTER_COLLATE </th><td class="description">Can quickly collate copies</td></tr>
-<tr><th>CUPS_PRINTER_COLOR </th><td class="description">Can do color printing</td></tr>
-<tr><th>CUPS_PRINTER_COMMANDS <span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span></th><td class="description">Printer supports maintenance commands
-</td></tr>
-<tr><th>CUPS_PRINTER_COPIES </th><td class="description">Can do copies in hardware</td></tr>
-<tr><th>CUPS_PRINTER_COVER </th><td class="description">Can cover output</td></tr>
-<tr><th>CUPS_PRINTER_DEFAULT </th><td class="description">Default printer on network</td></tr>
-<tr><th>CUPS_PRINTER_DISCOVERED <span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span></th><td class="description">Printer was discovered </td></tr>
-<tr><th>CUPS_PRINTER_DUPLEX </th><td class="description">Can do two-sided printing</td></tr>
-<tr><th>CUPS_PRINTER_FAX </th><td class="description">Fax queue</td></tr>
-<tr><th>CUPS_PRINTER_LARGE </th><td class="description">Can print on D/E/A1/A0-size media</td></tr>
-<tr><th>CUPS_PRINTER_LOCAL </th><td class="description">Local printer or class</td></tr>
-<tr><th>CUPS_PRINTER_MEDIUM </th><td class="description">Can print on Tabloid/B/C/A3/A2-size media</td></tr>
-<tr><th>CUPS_PRINTER_NOT_SHARED <span class="info">&#160;CUPS 1.2/macOS 10.5&#160;</span></th><td class="description">Printer is not shared
-</td></tr>
-<tr><th>CUPS_PRINTER_PUNCH </th><td class="description">Can punch output</td></tr>
-<tr><th>CUPS_PRINTER_REJECTING </th><td class="description">Printer is rejecting jobs</td></tr>
-<tr><th>CUPS_PRINTER_REMOTE </th><td class="description">Remote printer or class</td></tr>
-<tr><th>CUPS_PRINTER_SMALL </th><td class="description">Can print on Letter/Legal/A4-size media</td></tr>
-<tr><th>CUPS_PRINTER_SORT </th><td class="description">Can sort output</td></tr>
-<tr><th>CUPS_PRINTER_STAPLE </th><td class="description">Can staple output</td></tr>
-<tr><th>CUPS_PRINTER_VARIABLE </th><td class="description">Can print on rolls and custom-size media</td></tr>
+<tr><th>CUPS_WHICHJOBS_ACTIVE </th><td class="description">Pending/held/processing jobs</td></tr>
+<tr><th>CUPS_WHICHJOBS_ALL </th><td class="description">All jobs</td></tr>
+<tr><th>CUPS_WHICHJOBS_COMPLETED </th><td class="description">Completed/canceled/aborted jobs</td></tr>
 </tbody></table>
 <h3 class="enumeration"><a id="http_encoding_e">http_encoding_e</a></h3>
 <p class="description">HTTP transfer encoding values</p>
@@ -7891,7 +11710,7 @@ constants</p>
 <p class="description">HTTP encryption values</p>
 <h4 class="constants">Constants</h4>
 <table class="list"><tbody>
-<tr><th>HTTP_ENCRYPTION_ALWAYS </th><td class="description">Always encrypt (SSL)</td></tr>
+<tr><th>HTTP_ENCRYPTION_ALWAYS </th><td class="description">Always encrypt (HTTPS)</td></tr>
 <tr><th>HTTP_ENCRYPTION_IF_REQUESTED </th><td class="description">Encrypt if requested (TLS upgrade)</td></tr>
 <tr><th>HTTP_ENCRYPTION_NEVER </th><td class="description">Never encrypt</td></tr>
 <tr><th>HTTP_ENCRYPTION_REQUIRED </th><td class="description">Encryption is required (TLS upgrade)</td></tr>
@@ -7903,8 +11722,16 @@ constants</p>
 <tr><th>HTTP_FIELD_ACCEPT_ENCODING <span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span></th><td class="description">Accepting-Encoding field </td></tr>
 <tr><th>HTTP_FIELD_ACCEPT_LANGUAGE </th><td class="description">Accept-Language field</td></tr>
 <tr><th>HTTP_FIELD_ACCEPT_RANGES </th><td class="description">Accept-Ranges field</td></tr>
+<tr><th>HTTP_FIELD_ACCESS_CONTROL_ALLOW_CREDENTIALS <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">CORS/Fetch Access-Control-Allow-Credentials field </td></tr>
+<tr><th>HTTP_FIELD_ACCESS_CONTROL_ALLOW_HEADERS <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">CORS/Fetch Access-Control-Allow-Headers field </td></tr>
+<tr><th>HTTP_FIELD_ACCESS_CONTROL_ALLOW_METHODS <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">CORS/Fetch Access-Control-Allow-Methods field </td></tr>
+<tr><th>HTTP_FIELD_ACCESS_CONTROL_ALLOW_ORIGIN <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">CORS/Fetch Access-Control-Allow-Origin field </td></tr>
+<tr><th>HTTP_FIELD_ACCESS_CONTROL_EXPOSE_HEADERS <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">CORS/Fetch Access-Control-Expose-Headers field </td></tr>
+<tr><th>HTTP_FIELD_ACCESS_CONTROL_MAX_AGE <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">CORS/Fetch Access-Control-Max-Age field </td></tr>
+<tr><th>HTTP_FIELD_ACCESS_CONTROL_REQUEST_HEADERS <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">CORS/Fetch Access-Control-Request-Headers field </td></tr>
+<tr><th>HTTP_FIELD_ACCESS_CONTROL_REQUEST_METHOD <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">CORS/Fetch Access-Control-Request-Method field </td></tr>
 <tr><th>HTTP_FIELD_ALLOW <span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span></th><td class="description">Allow field </td></tr>
-<tr><th>HTTP_FIELD_AUTHENTICATION_INFO <span class="info">&#160;CUPS 2.2.9)&#160;</span></th><td class="description">Authentication-Info field (</td></tr>
+<tr><th>HTTP_FIELD_AUTHENTICATION_INFO <span class="info">&#160;CUPS 2.2.9&#160;</span></th><td class="description">Authentication-Info field </td></tr>
 <tr><th>HTTP_FIELD_AUTHORIZATION </th><td class="description">Authorization field</td></tr>
 <tr><th>HTTP_FIELD_CONNECTION </th><td class="description">Connection field</td></tr>
 <tr><th>HTTP_FIELD_CONTENT_ENCODING </th><td class="description">Content-Encoding field</td></tr>
@@ -7924,10 +11751,14 @@ constants</p>
 <tr><th>HTTP_FIELD_LINK </th><td class="description">Link field</td></tr>
 <tr><th>HTTP_FIELD_LOCATION </th><td class="description">Location field</td></tr>
 <tr><th>HTTP_FIELD_MAX </th><td class="description">Maximum field index</td></tr>
+<tr><th>HTTP_FIELD_OPTIONAL_WWW_AUTHENTICATE <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">RFC 8053 Optional-WWW-Authenticate field </td></tr>
+<tr><th>HTTP_FIELD_ORIGIN <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">RFC 6454 Origin field </td></tr>
+<tr><th>HTTP_FIELD_OSCORE <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">RFC 8613 OSCORE field </td></tr>
 <tr><th>HTTP_FIELD_RANGE </th><td class="description">Range field</td></tr>
 <tr><th>HTTP_FIELD_REFERER </th><td class="description">Referer field</td></tr>
 <tr><th>HTTP_FIELD_RETRY_AFTER </th><td class="description">Retry-After field</td></tr>
 <tr><th>HTTP_FIELD_SERVER <span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span></th><td class="description">Server field </td></tr>
+<tr><th>HTTP_FIELD_STRICT_TRANSPORT_SECURITY <span class="info">&#160;CUPS 2.4&#160;</span></th><td class="description">HSTS Strict-Transport-Security field </td></tr>
 <tr><th>HTTP_FIELD_TRANSFER_ENCODING </th><td class="description">Transfer-Encoding field</td></tr>
 <tr><th>HTTP_FIELD_UNKNOWN </th><td class="description">Unknown field</td></tr>
 <tr><th>HTTP_FIELD_UPGRADE </th><td class="description">Upgrade field</td></tr>
@@ -7941,9 +11772,16 @@ constants</p>
 <tr><th>HTTP_KEEPALIVE_OFF </th><td class="description">No keep alive support</td></tr>
 <tr><th>HTTP_KEEPALIVE_ON </th><td class="description">Use keep alive</td></tr>
 </tbody></table>
+<h3 class="enumeration"><a id="http_resolve_e">http_resolve_e</a></h3>
+<p class="description"><a href="#httpResolveURI"><code>httpResolveURI</code></a> options bit values</p>
+<h4 class="constants">Constants</h4>
+<table class="list"><tbody>
+<tr><th>HTTP_RESOLVE_DEFAULT </th><td class="description">Resolve with default options</td></tr>
+<tr><th>HTTP_RESOLVE_FAXOUT </th><td class="description">Resolve FaxOut service instead of Print</td></tr>
+<tr><th>HTTP_RESOLVE_FQDN </th><td class="description">Resolve to a FQDN</td></tr>
+</tbody></table>
 <h3 class="enumeration"><a id="http_state_e">http_state_e</a></h3>
-<p class="description">HTTP state values; states
-are server-oriented...</p>
+<p class="description">HTTP state values; states are server-oriented...</p>
 <h4 class="constants">Constants</h4>
 <table class="list"><tbody>
 <tr><th>HTTP_STATE_CONNECT </th><td class="description">CONNECT command, waiting for blank line</td></tr>
@@ -7969,23 +11807,32 @@ are server-oriented...</p>
 <h4 class="constants">Constants</h4>
 <table class="list"><tbody>
 <tr><th>HTTP_STATUS_ACCEPTED </th><td class="description">DELETE command was successful</td></tr>
+<tr><th>HTTP_STATUS_ALREADY_REPORTED </th><td class="description">Already reported (WebDAV)</td></tr>
 <tr><th>HTTP_STATUS_BAD_GATEWAY </th><td class="description">Bad gateway</td></tr>
 <tr><th>HTTP_STATUS_BAD_REQUEST </th><td class="description">Bad request</td></tr>
 <tr><th>HTTP_STATUS_CONFLICT </th><td class="description">Request is self-conflicting</td></tr>
+<tr><th>HTTP_STATUS_CONTENT_TOO_LARGE </th><td class="description">Content too large</td></tr>
 <tr><th>HTTP_STATUS_CONTINUE </th><td class="description">Everything OK, keep going...</td></tr>
 <tr><th>HTTP_STATUS_CREATED </th><td class="description">PUT command was successful</td></tr>
 <tr><th>HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED <span class="info">&#160;CUPS 1.4&#160;</span></th><td class="description">User canceled authorization </td></tr>
 <tr><th>HTTP_STATUS_CUPS_PKI_ERROR <span class="info">&#160;CUPS 1.5/macOS 10.7&#160;</span></th><td class="description">Error negotiating a secure connection </td></tr>
 <tr><th>HTTP_STATUS_ERROR </th><td class="description">An error response from httpXxxx()</td></tr>
 <tr><th>HTTP_STATUS_EXPECTATION_FAILED </th><td class="description">The expectation given in an Expect header field was not met</td></tr>
+<tr><th>HTTP_STATUS_FAILED_DEPENDENCY </th><td class="description">Failed dependency (WebDAV)</td></tr>
 <tr><th>HTTP_STATUS_FORBIDDEN </th><td class="description">Forbidden to access this URI</td></tr>
 <tr><th>HTTP_STATUS_FOUND </th><td class="description">Document was found at a different URI</td></tr>
 <tr><th>HTTP_STATUS_GATEWAY_TIMEOUT </th><td class="description">Gateway connection timed out</td></tr>
 <tr><th>HTTP_STATUS_GONE </th><td class="description">Server has gone away</td></tr>
+<tr><th>HTTP_STATUS_INSUFFICIENT_STORAGE </th><td class="description">Insufficient storage (WebDAV)</td></tr>
 <tr><th>HTTP_STATUS_LENGTH_REQUIRED </th><td class="description">A content length or encoding is required</td></tr>
+<tr><th>HTTP_STATUS_LOCKED </th><td class="description">Locked (WebDAV)</td></tr>
+<tr><th>HTTP_STATUS_LOOP_DETECTED </th><td class="description">Loop detected (WebDAV)</td></tr>
 <tr><th>HTTP_STATUS_METHOD_NOT_ALLOWED </th><td class="description">Method is not allowed</td></tr>
+<tr><th>HTTP_STATUS_MISDIRECTED_REQUEST </th><td class="description">Misdirected request</td></tr>
 <tr><th>HTTP_STATUS_MOVED_PERMANENTLY </th><td class="description">Document has moved permanently</td></tr>
 <tr><th>HTTP_STATUS_MULTIPLE_CHOICES </th><td class="description">Multiple files match request</td></tr>
+<tr><th>HTTP_STATUS_MULTI_STATUS </th><td class="description">Multiple status codes (WebDAV)</td></tr>
+<tr><th>HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED </th><td class="description">Network Authentication Required (WebDAV)</td></tr>
 <tr><th>HTTP_STATUS_NONE <span class="info">&#160;CUPS 1.7/macOS 10.9&#160;</span></th><td class="description">No Expect value </td></tr>
 <tr><th>HTTP_STATUS_NOT_ACCEPTABLE </th><td class="description">Not Acceptable</td></tr>
 <tr><th>HTTP_STATUS_NOT_AUTHORITATIVE </th><td class="description">Information isn't authoritative</td></tr>
@@ -7997,19 +11844,25 @@ are server-oriented...</p>
 <tr><th>HTTP_STATUS_OK </th><td class="description">OPTIONS/GET/HEAD/POST/TRACE command was successful</td></tr>
 <tr><th>HTTP_STATUS_PARTIAL_CONTENT </th><td class="description">Only a partial file was received/sent</td></tr>
 <tr><th>HTTP_STATUS_PAYMENT_REQUIRED </th><td class="description">Payment required</td></tr>
+<tr><th>HTTP_STATUS_PERMANENT_REDIRECT </th><td class="description">Permanent redirection</td></tr>
 <tr><th>HTTP_STATUS_PRECONDITION </th><td class="description">Precondition failed</td></tr>
+<tr><th>HTTP_STATUS_PRECONDITION_REQUIRED </th><td class="description">Precondition required (WebDAV)</td></tr>
 <tr><th>HTTP_STATUS_PROXY_AUTHENTICATION </th><td class="description">Proxy Authentication is Required</td></tr>
-<tr><th>HTTP_STATUS_REQUESTED_RANGE </th><td class="description">The requested range is not satisfiable</td></tr>
+<tr><th>HTTP_STATUS_RANGE_NOT_SATISFIABLE </th><td class="description">The requested range is not satisfiable</td></tr>
+<tr><th>HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE </th><td class="description">Request Header Fields Too Large (WebDAV)</td></tr>
 <tr><th>HTTP_STATUS_REQUEST_TIMEOUT </th><td class="description">Request timed out</td></tr>
-<tr><th>HTTP_STATUS_REQUEST_TOO_LARGE </th><td class="description">Request entity too large</td></tr>
 <tr><th>HTTP_STATUS_RESET_CONTENT </th><td class="description">Content was reset/recreated</td></tr>
 <tr><th>HTTP_STATUS_SEE_OTHER </th><td class="description">See this other link</td></tr>
 <tr><th>HTTP_STATUS_SERVER_ERROR </th><td class="description">Internal server error</td></tr>
 <tr><th>HTTP_STATUS_SERVICE_UNAVAILABLE </th><td class="description">Service is unavailable</td></tr>
 <tr><th>HTTP_STATUS_SWITCHING_PROTOCOLS </th><td class="description">HTTP upgrade to TLS/SSL</td></tr>
 <tr><th>HTTP_STATUS_TEMPORARY_REDIRECT </th><td class="description">Temporary redirection</td></tr>
+<tr><th>HTTP_STATUS_TOO_EARLY </th><td class="description">Too early (WebDAV)</td></tr>
+<tr><th>HTTP_STATUS_TOO_MANY_REQUESTS </th><td class="description">Too many requests (WebDAV)</td></tr>
 <tr><th>HTTP_STATUS_UNAUTHORIZED </th><td class="description">Unauthorized to access host</td></tr>
-<tr><th>HTTP_STATUS_UNSUPPORTED_MEDIATYPE </th><td class="description">The requested media type is unsupported</td></tr>
+<tr><th>HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS </th><td class="description">Unavailable For Legal Reasons (RFC 7725)</td></tr>
+<tr><th>HTTP_STATUS_UNPROCESSABLE_CONTENT </th><td class="description">Unprocessable content</td></tr>
+<tr><th>HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE </th><td class="description">The requested media type is unsupported</td></tr>
 <tr><th>HTTP_STATUS_UPGRADE_REQUIRED </th><td class="description">Upgrade to SSL/TLS required</td></tr>
 <tr><th>HTTP_STATUS_URI_TOO_LONG </th><td class="description">URI too long</td></tr>
 <tr><th>HTTP_STATUS_USE_PROXY </th><td class="description">Must use a proxy to access this URI</td></tr>