Merge pull request #5621 from zdohnal/cgigetarray-sigsegv
authorMichael R Sweet <michael.r.sweet@gmail.com>
Tue, 15 Oct 2019 21:06:53 +0000 (17:06 -0400)
committerGitHub <noreply@github.com>
Tue, 15 Oct 2019 21:06:53 +0000 (17:06 -0400)
SIGSEGV in CUPS web ui when adding a printer

77 files changed:
.gitignore
CHANGES.md
CONTRIBUTING.md
CREDITS.md
DEVELOPING.md
INSTALL.md
NOTICE
README.md
backend/ipp.c
backend/org.cups.usb-quirks
backend/usb-darwin.c
backend/usb-libusb.c
berkeley/lpr.c
cgi-bin/admin.c
config-scripts/cups-compiler.m4
config-scripts/cups-defaults.m4
configure
configure.ac
cups/Dependencies
cups/Makefile
cups/cups.h
cups/dest-options.c
cups/encode.c
cups/hash.c
cups/http.c
cups/ipp-support.c
cups/ipp.c
cups/ipp.h
cups/md5.c
cups/ppd-emit.c
cups/ppd-mark.c
cups/ppd.c
cups/ppd.h
cups/sidechannel.c
cups/snmp.c
cups/testipp.c
cups/testppd.c
cups/testthreads.c [new file with mode: 0644]
cups/tls-darwin.c
cups/tls-darwin.h [new file with mode: 0644]
cups/versioning.h
doc/help/api-admin.html
doc/help/api-filter.html
doc/help/api-ppd.html
doc/help/api-raster.html
doc/help/cupspm.epub
doc/help/cupspm.html
doc/help/license.html
doc/help/man-ipptoolfile.html
doc/help/postscript-driver.html
doc/help/ppd-compiler.html
doc/help/raster-driver.html
doc/help/spec-ppd.html
locale/cups.pot
locale/cups.strings
locale/cups_ca.po
locale/cups_cs.po
locale/cups_de.po
locale/cups_en.po
locale/cups_es.po
locale/cups_fr.po
locale/cups_it.po
locale/cups_ja.po
locale/cups_pt_BR.po
locale/cups_ru.po
locale/cups_zh_CN.po
locale/ipp-strings.c
man/ipptoolfile.5
ppdc/sample.drv
scheduler/client.c
scheduler/ipp.c
scheduler/main.c
systemv/lp.c
tools/ippeveprinter.c
vcnet/config.h
xcode/CUPS.xcodeproj/project.pbxproj
xcode/config.h

index dd9be57..2a8d1e4 100644 (file)
@@ -65,6 +65,7 @@ cups/testppd
 cups/testpwg
 cups/testraster
 cups/testsnmp
+cups/testthreads
 cups/tlscheck
 desktop/cups.desktop
 doc/index.html
index 9a434e7..c2635dd 100644 (file)
@@ -1,11 +1,30 @@
-CHANGES - 2.3.0 - 2019-07-16
+CHANGES - 2.3.1 - 2019-10-15
 ============================
 
 
+Changes in CUPS v2.3.1
+----------------------
+
+- Documentation updates (Issue #5661)
+- PPD files containing "custom" option keywords did not work (Issue #5639)
+- Added a workaround for the scheduler's systemd support (Issue #5640)
+- Fixed spelling of "fold-accordion".
+- Fixed the default common name for TLS certificates used by `ippeveprinter`.
+- Fixed a bug in the handling of printer resource files (Issue #5652)
+- The libusb-based USB backend now reports an error when the distribution
+  permissions are wrong (Issue #5658)
+- Added paint can labels to Dymo driver (Issue #5662)
+- The IPP backend did not detect all cases where a job should be retried using
+  a raster format (rdar://56021091)
+
+
 Changes in CUPS v2.3.0
 ----------------------
 
+- CVE-2019-8696 and CVE-2019-8675: Fixed SNMP buffer overflows (rdar://51685251)
+- Added a GPL2/LGPL2 exception to the new CUPS license terms.
 - Documentation updates (Issue #5604)
+- Localization updates (Issue #5637)
 - Fixed a bug in the scheduler job cleanup code (Issue #5588)
 - Fixed builds when there is no TLS library (Issue #5590)
 - Eliminated some new GCC compiler warnings (Issue #5591)
@@ -14,6 +33,7 @@ Changes in CUPS v2.3.0
 - Fixed potential excess logging from the scheduler when removing job files
   (Issue #5597)
 - Fixed a NULL pointer dereference bug in `httpGetSubField2` (Issue #5598)
+- Added FIPS-140 workarounds for GNU TLS (Issue #5601, Issue #5622)
 - The scheduler no longer provides a default value for the description
   (Issue #5603)
 - The scheduler now logs jobs held for authentication using the error level so
@@ -23,12 +43,23 @@ Changes in CUPS v2.3.0
 - The scheduler now uses both the group's membership list as well as the
   various OS-specific membership functions to determine whether a user belongs
   to a named group (Issue #5613)
+- Added USB quirks rule for HP LaserJet 1015 (Issue #5617)
+- Fixed some PPD parser issues (Issue #5623, Issue #5624)
+- The IPP parser no longer allows invalid member attributes in collections
+  (Issue #5630)
+- The configure script now treats the "wheel" group as a potential system
+  group (Issue #5638)
+- Fixed a USB printing issue on macOS (rdar://31433931)
+- Fixed IPP buffer overflow (rdar://50035411)
+- Fixed memory disclosure issue in the scheduler (rdar://51373853)
+- Fixed DoS issues in the scheduler (rdar://51373929)
 - Fixed an issue with unsupported "sides" values in the IPP backend
   (rdar://51775322)
 - The scheduler would restart continuously when idle and printers were not
   shared (rdar://52561199)
 - Fixed an issue with `EXPECT !name WITH-VALUE ...` tests.
 - Fixed a command ordering issue in the Zebra ZPL driver.
+- Fixed a memory leak in `ppdOpen`.
 
 
 Changes in CUPS v2.3rc1
index be2ab40..2421d0d 100644 (file)
@@ -2,13 +2,14 @@ Contributing to CUPS
 ====================
 
 CUPS is developed by Apple Inc. and distributed as open source software under
-the Apache License, Version 2.0.  Significant contributions to CUPS must be
-licensed to Apple using the Apple Contributor Agreement:
+the Apache License, Version 2.0 with exceptions to allow linking to GPL2/LGPL2
+code.  Significant contributions to CUPS must be licensed to Apple using the
+Apple Contributor Agreement:
 
     https://www.cups.org/AppleContributorAgreement_2011-03-10.pdf
 
-Contributions should be submitted as attachments to bug reports on the CUPS web
-site.  Changes to existing source files should be submitted as unified diffs
-(both Subversion and Git produce this format by default) while new source files
+Contributions should be submitted as attachments to bug reports on the
+[CUPS Github project](https://github.com/apple/cups).  Changes to existing
+source files should be submitted as unified diffs while new source files
 should be provided as-is or in an archive.  Github pull requests can also be
 used to submit changes.
index 7d5a8b9..8b1a15d 100644 (file)
@@ -1,4 +1,4 @@
-CREDITS - 2017-05-01
+CREDITS - 2019-08-21
 ====================
 
 Few projects are completed by one person, and CUPS is no exception.  We'd like
index 027ddc1..df76323 100644 (file)
@@ -63,7 +63,9 @@ major, minor, and patch release numbers.  Major release numbers indicate large
 design changes or backwards-incompatible changes to the CUPS API or CUPS
 Imaging API.  Minor release numbers indicate new features and other smaller
 changes which are backwards-compatible with previous CUPS releases.  Patch
-numbers indicate bug fixes to the previous feature or patch release.
+numbers indicate bug fixes to the previous feature or patch release.  This
+version numbering scheme is consistent with the
+[Semantic Versioning](http://semver.org) specification.
 
 > Note:
 >
@@ -114,6 +116,10 @@ Contributed source code must follow the guidelines below.  While the examples
 are for C and C++ source files, source code for other languages should conform
 to the same guidelines as allowed by the language.
 
+Source code comments provide the reference portion of the CUPS Programming
+Manual, which is generated using the [codedoc](https://www.msweet.org/codedoc)
+software.
+
 
 ### Source Files
 
@@ -270,15 +276,17 @@ Return/output values are indicated using an "O" prefix, input values are
 indicated using the "I" prefix, and values that are both input and output use
 the "IO" prefix for the corresponding in-line comment.
 
-The Mini-XML documentation generator also understands the following special
-text in the function description comment:
+The [codedoc](https://www.msweet.org/codedoc) documentation generator also
+understands the following special text in the function description comment:
 
-    @deprecated@         - Marks the function as deprecated (not recommended
-                           for new development and scheduled for removal)
+    @deprecated@         - Marks the function as deprecated: not recommended
+                           for new development and scheduled for removal.
+    @link name@          - Provides a hyperlink to the corresponding function
+                           or type definition.
     @since CUPS version@ - Marks the function as new in the specified version
                            of CUPS.
-    @private@            - Marks the function as private (same as starting the
-                           function name with an underscore)
+    @private@            - Marks the function as private so it will not be
+                           included in the documentation.
 
 
 ### Variables
index 16ba328..d2afc4c 100644 (file)
@@ -1,4 +1,4 @@
-INSTALL - CUPS v2.3.0 - 2019-05-24
+INSTALL - CUPS v2.3.0 - 2019-08-21
 ==================================
 
 This file describes how to compile and install CUPS from source code. For more
diff --git a/NOTICE b/NOTICE
index 5393010..bf088fd 100644 (file)
--- a/NOTICE
+++ b/NOTICE
@@ -1,6 +1,6 @@
 CUPS
 
-Copyright © 2007-2018 by Apple Inc.
+Copyright © 2007-2019 by Apple Inc.
 Copyright © 1997-2007 by Easy Software Products.
 
 CUPS and the CUPS logo are trademarks of Apple Inc.
@@ -32,3 +32,20 @@ the following restrictions:
   2. Altered source versions must be plainly marked as such, and must not be
      misrepresented as being the original software.
   3. This notice may not be removed or altered from any source distribution.
+
+
+-- CUPS Exceptions to the Apache 2.0 License --
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into an Object form of such source code, you
+may redistribute such embedded portions in such Object form without complying
+with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
+
+In addition, if you combine or link compiled forms of this Software with
+software that is licensed under the GPLv2 ("Combined Software") and if a
+court of competent jurisdiction determines that the patent provision (Section
+3), the indemnity provision (Section 9) or other Section of the License
+conflicts with the conditions of the GPLv2, you may retroactively and
+prospectively choose to deem waived or otherwise exclude such Section(s) of
+the License, but only in their entirety and only with respect to the Combined
+Software.
index 59c09c6..ee1125b 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,13 +1,9 @@
-README - CUPS v2.3.0 - 2019-05-24
+README - CUPS v2.3.1 - 2019-10-07
 =================================
 
-Looking for compile instructions?  Read the file `INSTALL.md` instead...
-
-
 INTRODUCTION
 ------------
 
-
 CUPS is a standards-based, open source printing system developed by Apple Inc.
 for macOS® and other UNIX®-like operating systems.  CUPS uses the Internet
 Printing Protocol ("IPP") and provides System V and Berkeley command-line
@@ -29,8 +25,21 @@ CUPS is licensed under the Apache License Version 2.0.  See the file
 READING THE DOCUMENTATION
 -------------------------
 
+Initial documentation to get you started is provided in the root directory of
+the CUPS sources:
+
+- `CHANGES.md`: A list of changes in the current major release of CUPS.
+- `CONTRIBUTING.md`: Guidelines for contributing to the CUPS project.
+- `CREDITS.md`: A list of past contributors to the CUPS project.
+- `DEVELOPING.md`: Guidelines for developing code for the CUPS project.
+- `INSTALL.md`: Instructions for building and installing CUPS.
+- `LICENSE`: The CUPS license agreement (Apache 2.0).
+- `NOTICE`: Copyright notices and exceptions to the CUPS license agreement.
+- `README.md`: This file.
+
 Once you have installed the software you can access the documentation (and a
-bunch of other stuff) online at <http://localhost:631/>.
+bunch of other stuff) online at <http://localhost:631/> and using the `man`
+command, for example `man cups`.
 
 If you're having trouble getting that far, the documentation is located under
 the `doc/help` and `man` directories.
@@ -56,11 +65,11 @@ in your browser to access the printer administration tools:
 
 *Do not* use the hostname for your machine - it will not work with the default
 CUPS configuration.  To enable administration access on other addresses, check
-the `Allow Remote Administration` box and click on the `Change Settings button.
+the `Allow Remote Administration` box and click on the `Change Settings` button.
 
 You will be asked for the administration password (root or any other user in the
-sys/system/root/admin/lpadmin group on your system) when performing any
-administrative function.
+"sys", "system", "root", "admin", or "lpadmin" group on your system) when
+performing any administrative function.
 
 
 SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
@@ -70,28 +79,28 @@ CUPS currently uses PPD (PostScript Printer Description) files that describe
 printer capabilities and driver programs needed for each printer.  The
 `everywhere` PPD is used for nearly all modern networks printers sold since
 about 2009.  For example, the following command creates a print queue for a
-printer at address 11.22.33.44:
+printer at address "11.22.33.44":
 
     lpadmin -p printername -E -v ipp://11.22.33.44/ipp/print -m everywhere
 
 CUPS also includes several sample PPD files you can use for "legacy" printers:
 
-    Driver                         PPD Name
-    -----------------------------  ------------------------------
-    Dymo Label Printers            drv:///sample.drv/dymo.ppd
-    Intellitech Intellibar         drv:///sample.drv/intelbar.ppd
-    EPSON 9-pin Series             drv:///sample.drv/epson9.ppd
-    EPSON 24-pin Series            drv:///sample.drv/epson24.ppd
-    Generic PCL Laser Printer      drv:///sample.drv/generpcl.ppd
-    Generic PostScript Printer     drv:///sample.drv/generic.ppd
-    HP DeskJet Series              drv:///sample.drv/deskjet.ppd
-    HP LaserJet Series             drv:///sample.drv/laserjet.ppd
-    OKIDATA 9-Pin Series           drv:///sample.drv/okidata9.ppd
-    OKIDATA 24-Pin Series          drv:///sample.drv/okidat24.ppd
-    Zebra CPCL Label Printer       drv:///sample.drv/zebracpl.ppd
-    Zebra EPL1 Label Printer       drv:///sample.drv/zebraep1.ppd
-    Zebra EPL2 Label Printer       drv:///sample.drv/zebraep2.ppd
-    Zebra ZPL Label Printer        drv:///sample.drv/zebra.ppd
+   Driver                         | PPD Name
+   -----------------------------  | ------------------------------
+   Dymo Label Printers            | drv:///sample.drv/dymo.ppd
+   Intellitech Intellibar         | drv:///sample.drv/intelbar.ppd
+   EPSON 9-pin Series             | drv:///sample.drv/epson9.ppd
+   EPSON 24-pin Series            | drv:///sample.drv/epson24.ppd
+   Generic PCL Laser Printer      | drv:///sample.drv/generpcl.ppd
+   Generic PostScript Printer     | drv:///sample.drv/generic.ppd
+   HP DeskJet Series              | drv:///sample.drv/deskjet.ppd
+   HP LaserJet Series             | drv:///sample.drv/laserjet.ppd
+   OKIDATA 9-Pin Series           | drv:///sample.drv/okidata9.ppd
+   OKIDATA 24-Pin Series          | drv:///sample.drv/okidat24.ppd
+   Zebra CPCL Label Printer       | drv:///sample.drv/zebracpl.ppd
+   Zebra EPL1 Label Printer       | drv:///sample.drv/zebraep1.ppd
+   Zebra EPL2 Label Printer       | drv:///sample.drv/zebraep2.ppd
+   Zebra ZPL Label Printer        | drv:///sample.drv/zebra.ppd
 
 You can run the `lpinfo -m` command to list all of the available drivers:
 
@@ -151,9 +160,9 @@ LEGAL STUFF
 Copyright © 2007-2019 by Apple Inc.
 Copyright © 1997-2007 by Easy Software Products.
 
-CUPS is provided under the terms of the Apache License, Version 2.0.  A copy of
-this license can be found in the file `LICENSE`.  Additional legal information
-is provided in the file `NOTICE`.
+CUPS is provided under the terms of the Apache License, Version 2.0 with
+exceptions for GPL2/LGPL2 software.  A copy of this license can be found in the
+file `LICENSE`.  Additional legal information is provided in the file `NOTICE`.
 
 Unless required by applicable law or agreed to in writing, software distributed
 under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
index 8226acc..b2b2206 100644 (file)
@@ -1450,6 +1450,8 @@ main(int  argc,                           /* I - Number of command-line args */
   monitor.printer_state = IPP_PSTATE_IDLE;
   monitor.retryable     = argc == 6 && document_format && strcmp(document_format, "image/pwg-raster") && strcmp(document_format, "image/urf");
 
+  fprintf(stderr, "DEBUG: retryable=%d\n", monitor.retryable);
+
   if (create_job)
   {
     monitor.job_name = argv[3];
@@ -1867,21 +1869,29 @@ main(int  argc,                         /* I - Number of command-line args */
        response = cupsGetResponse(http, resource);
        ippDelete(request);
 
-       fprintf(stderr, "DEBUG: Send-Document: %s (%s)\n",
-               ippErrorString(cupsLastError()), cupsLastErrorString());
+       fprintf(stderr, "DEBUG: Send-Document: %s (%s)\n", ippErrorString(cupsLastError()), cupsLastErrorString());
         debug_attributes(response);
-        ippDelete(response);
 
        if (cupsLastError() > IPP_STATUS_OK_CONFLICTING && !job_canceled)
        {
+         ipp_attribute_t *reasons = ippFindAttribute(response, "job-state-reasons", IPP_TAG_KEYWORD);
+                                       /* job-state-reasons values */
+
          ipp_status = cupsLastError();
 
-         _cupsLangPrintFilter(stderr, "ERROR",
-                              _("Unable to add document to print job."));
+          if (ippContainsString(reasons, "document-format-error"))
+            ipp_status = IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR;
+          else if (ippContainsString(reasons, "document-unprintable"))
+            ipp_status = IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE;
+
+         ippDelete(response);
+         _cupsLangPrintFilter(stderr, "ERROR", _("Unable to add document to print job."));
          break;
        }
        else
        {
+         ippDelete(response);
+
          password_tries = 0;
 
          if (num_files == 0 || fd < 0)
@@ -1898,7 +1908,7 @@ main(int  argc,                           /* I - Number of command-line args */
       fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1);
       copies_remaining --;
     }
-    else if ((ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED || ipp_status == IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE) &&
+    else if ((ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED || ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR || ipp_status == IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE) &&
              argc == 6 &&
              document_format && strcmp(document_format, "image/pwg-raster") && strcmp(document_format, "image/urf"))
     {
index 44d6bb8..cd684d3 100644 (file)
 # All Intermec devices (Issue #4553)
 0x067e no-reattach
 
+# HP LaserJet 1015 (Issue #5617)
+0x03f0 0x0e17 delay-close
+
 # HP LaserJet 1150 (Issue #4549)
 0x03f0 0x0f17 delay-close
 
index d6ad587..1c412da 100644 (file)
@@ -1280,6 +1280,9 @@ static Boolean find_device_cb(io_service_t obj, printer_interface_t printerIntf,
         (*printerIntf)->GetInterfaceNumber(printerIntf, &intfNumber);
         (*printerIntf)->GetLocationID(printerIntf, &intfLocation);
 
+        if (intfProtocol == kUSBPrintingProtocolIPP)
+            return keepLooking;
+
         if (g.serial != NULL && CFStringGetLength(g.serial) > 0)
         {
           if (serial != NULL && CFStringCompare(serial, g.serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
@@ -1287,12 +1290,9 @@ static Boolean find_device_cb(io_service_t obj, printer_interface_t printerIntf,
             g.interfaceProtocol = intfProtocol;
             g.location = intfLocation;
             g.alternateSetting = intfAltSetting;
-            if (intfProtocol != kUSBPrintingProtocolIPP)
-            {
-              g.printer_obj = obj;
-              IOObjectRetain(obj);
-            }
-            keepLooking = (intfProtocol == kUSBPrintingProtocolIPP);
+            g.printer_obj = obj;
+            IOObjectRetain(obj);
+            keepLooking = false;
           }
         }
         else
@@ -1300,14 +1300,14 @@ static Boolean find_device_cb(io_service_t obj, printer_interface_t printerIntf,
           if (g.printer_obj != 0)
             IOObjectRelease(g.printer_obj);
 
+            if (g.location == 0 || g.location == intfLocation)
+                keepLooking = false;
+
             g.location = intfLocation;
             g.alternateSetting = intfAltSetting;
             g.interfaceProtocol = intfProtocol;
             g.printer_obj = obj;
             IOObjectRetain(obj);
-
-            if (g.location == 0 || g.location == intfLocation)
-              keepLooking = false;
         }
 
         if (!keepLooking)
index 87606ac..1c4d9f1 100644 (file)
@@ -826,8 +826,7 @@ find_device(usb_cb_t   cb,          /* I - Callback function */
   err = libusb_init(NULL);
   if (err)
   {
-    fprintf(stderr, "DEBUG: Unable to initialize USB access via libusb, "
-                    "libusb error %i\n", (int)err);
+    fprintf(stderr, "ERROR: Unable to initialize USB access via libusb, libusb error %i (%s)\n", (int)err, libusb_strerror((int)err));
     return (NULL);
   }
 
index a9aed3c..627fa6a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * "lpr" command for CUPS.
  *
- * Copyright © 2007-2018 by Apple Inc.
+ * Copyright © 2007-2019 by Apple Inc.
  * Copyright © 1997-2007 by Easy Software Products.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -445,9 +445,9 @@ usage(void)
                           "                        Specify 2-sided portrait printing"));
   _cupsLangPuts(stdout, _("-o sides=two-sided-short-edge\n"
                           "                        Specify 2-sided landscape printing"));
+  _cupsLangPuts(stdout, _("-P destination          Specify the destination"));
   _cupsLangPuts(stdout, _("-q                      Specify the job should be held for printing"));
   _cupsLangPuts(stdout, _("-r                      Remove the file(s) after submission"));
-  _cupsLangPuts(stdout, _("-P destination          Specify the destination"));
   _cupsLangPuts(stdout, _("-T title                Specify the job title"));
   _cupsLangPuts(stdout, _("-U username             Specify the username to use for authentication"));
 
index f8c5763..f087809 100644 (file)
@@ -2929,6 +2929,9 @@ do_set_options(http_t *http,              /* I - HTTP connection */
 
              switch (cparam->type)
              {
+               case PPD_CUSTOM_UNKNOWN :
+                   break;
+
                case PPD_CUSTOM_POINTS :
                    if (!_cups_strncasecmp(option->defchoice, "Custom.", 7))
                    {
@@ -3528,6 +3531,9 @@ get_option_value(
 
     switch (cparam->type)
     {
+      case PPD_CUSTOM_UNKNOWN :
+         break;
+
       case PPD_CUSTOM_CURVE :
       case PPD_CUSTOM_INVCURVE :
       case PPD_CUSTOM_REAL :
@@ -3606,6 +3612,9 @@ get_option_value(
 
       switch (cparam->type)
       {
+       case PPD_CUSTOM_UNKNOWN :
+           break;
+
        case PPD_CUSTOM_CURVE :
        case PPD_CUSTOM_INVCURVE :
        case PPD_CUSTOM_REAL :
index 86e8bc4..63ea1f4 100644 (file)
@@ -175,8 +175,10 @@ if test -n "$GCC"; then
        # doesn't trigger...
        gccversion=`$CC --version | head -1 | awk '{print $NF}'`
        case "$gccversion" in
-               7.* | 8.*)
-                       WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-tautological-compare"
+               1.* | 2.* | 3.* | 4.* | 5.* | 6.* | \(clang-*)
+                       ;;
+               *)
+                       WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-format-overflow -Wno-tautological-compare"
                        ;;
        esac
 
index b3d96ef..517539e 100644 (file)
@@ -245,7 +245,7 @@ AC_ARG_WITH(system_groups, [  --with-system-groups    set default system groups
                AC_MSG_CHECKING(for default system groups)
                if test -f /etc/group; then
                        CUPS_SYSTEM_GROUPS=""
-                       GROUP_LIST="lpadmin sys system root"
+                       GROUP_LIST="lpadmin sys system root wheel"
                        for group in $GROUP_LIST; do
                                if test "`grep \^${group}: /etc/group`" != ""; then
                                        if test "x$CUPS_SYSTEM_GROUPS" = x; then
index 840b42c..8c6e6e8 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for CUPS 2.3.0.
+# Generated by GNU Autoconf 2.69 for CUPS 2.3.1.
 #
 # Report bugs to <https://github.com/apple/cups/issues>.
 #
@@ -580,8 +580,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='CUPS'
 PACKAGE_TARNAME='cups'
-PACKAGE_VERSION='2.3.0'
-PACKAGE_STRING='CUPS 2.3.0'
+PACKAGE_VERSION='2.3.1'
+PACKAGE_STRING='CUPS 2.3.1'
 PACKAGE_BUGREPORT='https://github.com/apple/cups/issues'
 PACKAGE_URL='https://www.cups.org/'
 
@@ -1467,7 +1467,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures CUPS 2.3.0 to adapt to many kinds of systems.
+\`configure' configures CUPS 2.3.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1532,7 +1532,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of CUPS 2.3.0:";;
+     short | recursive ) echo "Configuration of CUPS 2.3.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1713,7 +1713,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-CUPS configure 2.3.0
+CUPS configure 2.3.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2177,7 +2177,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by CUPS $as_me 2.3.0, which was
+It was created by CUPS $as_me 2.3.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2694,7 +2694,7 @@ done
 ac_config_headers="$ac_config_headers config.h"
 
 
-CUPS_VERSION="2.3.0"
+CUPS_VERSION="2.3.1"
 CUPS_REVISION=""
 CUPS_BUILD="cups-$CUPS_VERSION"
 
@@ -6911,8 +6911,10 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        # doesn't trigger...
        gccversion=`$CC --version | head -1 | awk '{print $NF}'`
        case "$gccversion" in
-               7.* | 8.*)
-                       WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-tautological-compare"
+               1.* | 2.* | 3.* | 4.* | 5.* | 6.* | \(clang-*)
+                       ;;
+               *)
+                       WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-format-overflow -Wno-tautological-compare"
                        ;;
        esac
 
@@ -9593,7 +9595,7 @@ else
 $as_echo_n "checking for default system groups... " >&6; }
                if test -f /etc/group; then
                        CUPS_SYSTEM_GROUPS=""
-                       GROUP_LIST="lpadmin sys system root"
+                       GROUP_LIST="lpadmin sys system root wheel"
                        for group in $GROUP_LIST; do
                                if test "`grep \^${group}: /etc/group`" != ""; then
                                        if test "x$CUPS_SYSTEM_GROUPS" = x; then
@@ -10385,7 +10387,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by CUPS $as_me 2.3.0, which was
+This file was extended by CUPS $as_me 2.3.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -10448,7 +10450,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-CUPS config.status 2.3.0
+CUPS config.status 2.3.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index 7eca9e3..23abe87 100644 (file)
@@ -12,7 +12,7 @@ dnl We need at least autoconf 2.60...
 AC_PREREQ(2.60)
 
 dnl Package name and version...
-AC_INIT([CUPS], [2.3.0], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/])
+AC_INIT([CUPS], [2.3.1], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/])
 
 sinclude(config-scripts/cups-opsys.m4)
 sinclude(config-scripts/cups-common.m4)
index b30c769..1cb291b 100644 (file)
@@ -188,7 +188,7 @@ tls.o: tls.c cups-private.h string-private.h ../config.h \
   ipp-private.h ../cups/cups.h file.h ipp.h http.h array.h language.h \
   pwg.h http-private.h ../cups/language.h ../cups/http.h \
   language-private.h ../cups/transcode.h pwg-private.h thread-private.h \
-  debug-internal.h debug-private.h tls-darwin.c
+  debug-internal.h debug-private.h tls-darwin.c tls-darwin.h
 transcode.o: transcode.c cups-private.h string-private.h ../config.h \
   ../cups/versioning.h array-private.h ../cups/array.h versioning.h \
   ipp-private.h ../cups/cups.h file.h ipp.h http.h array.h language.h \
@@ -214,7 +214,7 @@ adminutil.o: adminutil.c cups-private.h string-private.h ../config.h \
   language-private.h ../cups/transcode.h pwg-private.h thread-private.h \
   debug-internal.h debug-private.h ppd.h cups.h raster.h adminutil.h
 backchannel.o: backchannel.c cups.h file.h versioning.h ipp.h http.h \
-  array.h language.h pwg.h
+  array.h language.h pwg.h sidechannel.h
 backend.o: backend.c cups-private.h string-private.h ../config.h \
   ../cups/versioning.h array-private.h ../cups/array.h versioning.h \
   ipp-private.h ../cups/cups.h file.h ipp.h http.h array.h language.h \
@@ -401,6 +401,9 @@ testsnmp.o: testsnmp.c cups-private.h string-private.h ../config.h \
   pwg.h http-private.h ../cups/language.h ../cups/http.h \
   language-private.h ../cups/transcode.h pwg-private.h thread-private.h \
   snmp-private.h
+testthreads.o: testthreads.c ../cups/cups.h file.h versioning.h ipp.h \
+  http.h array.h language.h pwg.h ../cups/thread-private.h ../config.h \
+  ../cups/versioning.h
 tlscheck.o: tlscheck.c cups-private.h string-private.h ../config.h \
   ../cups/versioning.h array-private.h ../cups/array.h versioning.h \
   ipp-private.h ../cups/cups.h file.h ipp.h http.h array.h language.h \
index 87d85ba..4e2aa6d 100644 (file)
@@ -106,6 +106,7 @@ TESTOBJS    = \
                testpwg.o \
                testraster.o \
                testsnmp.o \
+               testthreads.o \
                tlscheck.o
 OBJS   =       \
                $(LIBOBJS) \
@@ -191,6 +192,7 @@ UNITTARGETS =       \
                testpwg \
                testraster \
                testsnmp \
+               testthreads \
                tlscheck
 
 TARGETS        =       \
@@ -700,6 +702,16 @@ testsnmp:  testsnmp.o $(LIBCUPSSTATIC)
        $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@
 
 
+#
+# testthreads (dependency on static CUPS library is intentional)
+#
+
+testthreads:   testthreads.o $(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(LD_CC) $(ALL_LDFLAGS) -o $@ testthreads.o $(LINKCUPSSTATIC)
+       $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@
+
+
 #
 # tlscheck (dependency on static CUPS library is intentional)
 #
index e64fdcc..77a66c1 100644 (file)
@@ -42,10 +42,10 @@ extern "C" {
  * Constants...
  */
 
-#  define CUPS_VERSION                 2.0300
+#  define CUPS_VERSION                 2.0301
 #  define CUPS_VERSION_MAJOR           2
 #  define CUPS_VERSION_MINOR           3
-#  define CUPS_VERSION_PATCH           0
+#  define CUPS_VERSION_PATCH           1
 
 #  define CUPS_BC_FD                   3
                                        /* Back-channel file descriptor for
index f4d7510..8c5fe66 100644 (file)
@@ -59,7 +59,7 @@ static void           cups_update_ready(http_t *http, cups_dinfo_t *dinfo);
 /*
  * 'cupsAddDestMediaOptions()' - Add the option corresponding to the specified media size.
  *
- * @since CUPS 2.3@
+ * @since CUPS 2.3/macOS 10.14@
  */
 
 int                                    /* O  - New number of options */
index bda910b..2469406 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Option encoding routines for CUPS.
  *
- * Copyright © 2007-2018 by Apple Inc.
+ * Copyright © 2007-2019 by Apple Inc.
  * Copyright © 1997-2007 by Easy Software Products.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -673,7 +673,7 @@ _cupsEncodeOption(
 /*
  * 'cupsEncodeOption()' - Encode a single option into an IPP attribute.
  *
- * @since CUPS 2.3@
+ * @since CUPS 2.3/macOS 10.14@
  */
 
 ipp_attribute_t        *                       /* O - New attribute or @code NULL@ on error */
index 0614860..4fbb443 100644 (file)
@@ -16,6 +16,7 @@
 #  include <CommonCrypto/CommonDigest.h>
 #elif defined(HAVE_GNUTLS)
 #  include <gnutls/crypto.h>
+#  include "md5-internal.h"
 #else
 #  include "md5-internal.h"
 #endif /* __APPLE__ */
@@ -185,8 +186,24 @@ cupsHashData(const char    *algorithm,     /* I - Algorithm name */
   unsigned char        temp[64];               /* Temporary hash buffer */
   size_t       tempsize = 0;           /* Truncate to this size? */
 
+
   if (!strcmp(algorithm, "md5"))
-    alg = GNUTLS_DIG_MD5;
+  {
+   /*
+    * Some versions of GNU TLS disable MD5 without warning...
+    */
+
+    _cups_md5_state_t  state;          /* MD5 state info */
+
+    if (hashsize < 16)
+      goto too_small;
+
+    _cupsMD5Init(&state);
+    _cupsMD5Append(&state, data, datalen);
+    _cupsMD5Finish(&state, hash);
+
+    return (16);
+  }
   else if (!strcmp(algorithm, "sha"))
     alg = GNUTLS_DIG_SHA1;
   else if (!strcmp(algorithm, "sha2-224"))
@@ -242,6 +259,9 @@ cupsHashData(const char    *algorithm,      /* I - Algorithm name */
   {
     _cups_md5_state_t  state;          /* MD5 state info */
 
+    if (hashsize < 16)
+      goto too_small;
+
     _cupsMD5Init(&state);
     _cupsMD5Append(&state, data, datalen);
     _cupsMD5Finish(&state, hash);
index 266a157..fbb1bf1 100644 (file)
@@ -1860,7 +1860,7 @@ httpPrintf(http_t     *http,              /* I - HTTP connection */
           ...)                         /* I - Additional args as needed */
 {
   ssize_t      bytes;                  /* Number of bytes to write */
-  char         buf[16384];             /* Buffer for formatted string */
+  char         buf[65536];             /* Buffer for formatted string */
   va_list      ap;                     /* Variable argument pointer */
 
 
@@ -1872,7 +1872,12 @@ httpPrintf(http_t     *http,             /* I - HTTP connection */
 
   DEBUG_printf(("3httpPrintf: (" CUPS_LLFMT " bytes) %s", CUPS_LLCAST bytes, buf));
 
-  if (http->data_encoding == HTTP_ENCODING_FIELDS)
+  if (bytes > (ssize_t)(sizeof(buf) - 1))
+  {
+    http->error = ENOMEM;
+    return (-1);
+  }
+  else if (http->data_encoding == HTTP_ENCODING_FIELDS)
     return ((int)httpWrite2(http, buf, (size_t)bytes));
   else
   {
index 7d028b4..192f5b6 100644 (file)
@@ -460,7 +460,7 @@ static const char * const ipp_document_states[] =
                  "punch-multiple-top", /* IPP Finishings 2.1/Canon */
                  "punch-multiple-right",/* IPP Finishings 2.1/Canon */
                  "punch-multiple-bottom",/* IPP Finishings 2.1/Canon */
-                 "fold-accordian",     /* IPP Finishings 2.0 */
+                 "fold-accordion",     /* IPP Finishings 2.0 */
                  "fold-double-gate",   /* IPP Finishings 2.0 */
                  "fold-gate",          /* IPP Finishings 2.0 */
                  "fold-half",          /* IPP Finishings 2.0 */
@@ -571,7 +571,7 @@ static const char * const ipp_document_states[] =
                  "0x40000057",
                  "0x40000058",
                  "0x40000059",
-                 "cups-fold-accordian",
+                 "cups-fold-accordion",
                  "cups-fold-double-gate",
                  "cups-fold-gate",
                  "cups-fold-half",
index 0248cb9..1bd59ce 100644 (file)
@@ -3040,8 +3040,13 @@ ippReadIO(void       *src,               /* I - Data source */
 
           DEBUG_printf(("2ippReadIO: name length=%d", n));
 
-          if (n == 0 && tag != IPP_TAG_MEMBERNAME &&
-             tag != IPP_TAG_END_COLLECTION)
+          if (n && parent)
+          {
+            _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid named IPP attribute in collection."), 1);
+            DEBUG_puts("1ippReadIO: bad attribute name in collection.");
+            return (IPP_STATE_ERROR);
+          }
+          else if (n == 0 && tag != IPP_TAG_MEMBERNAME && tag != IPP_TAG_END_COLLECTION)
          {
           /*
            * More values for current attribute...
@@ -4545,9 +4550,7 @@ ippSetValueTag(
         break;
 
     case IPP_TAG_NAME :
-        if (temp_tag != IPP_TAG_KEYWORD && temp_tag != IPP_TAG_URI &&
-            temp_tag != IPP_TAG_URISCHEME && temp_tag != IPP_TAG_LANGUAGE &&
-            temp_tag != IPP_TAG_MIMETYPE)
+        if (temp_tag != IPP_TAG_KEYWORD)
           return (0);
 
         (*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_CUPS_CONST));
@@ -4555,10 +4558,7 @@ ippSetValueTag(
 
     case IPP_TAG_NAMELANG :
     case IPP_TAG_TEXTLANG :
-        if (value_tag == IPP_TAG_NAMELANG &&
-            (temp_tag != IPP_TAG_NAME && temp_tag != IPP_TAG_KEYWORD &&
-             temp_tag != IPP_TAG_URI && temp_tag != IPP_TAG_URISCHEME &&
-             temp_tag != IPP_TAG_LANGUAGE && temp_tag != IPP_TAG_MIMETYPE))
+        if (value_tag == IPP_TAG_NAMELANG && (temp_tag != IPP_TAG_NAME && temp_tag != IPP_TAG_KEYWORD))
           return (0);
 
         if (value_tag == IPP_TAG_TEXTLANG && temp_tag != IPP_TAG_TEXT)
index 6402855..b7412a4 100644 (file)
@@ -145,11 +145,11 @@ typedef enum ipp_finishings_e             /**** Finishings values ****/
   IPP_FINISHINGS_PUNCH_QUAD_TOP,       /* Punch 4 holes top edge */
   IPP_FINISHINGS_PUNCH_QUAD_RIGHT,     /* Punch 4 holes right side */
   IPP_FINISHINGS_PUNCH_QUAD_BOTTOM,    /* Punch 4 holes bottom edge */
-  IPP_FINISHINGS_PUNCH_MULTIPLE_LEFT,  /* Pucnh multiple holes left side */
-  IPP_FINISHINGS_PUNCH_MULTIPLE_TOP,   /* Pucnh multiple holes top edge */
-  IPP_FINISHINGS_PUNCH_MULTIPLE_RIGHT, /* Pucnh multiple holes right side */
-  IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM,        /* Pucnh multiple holes bottom edge */
-  IPP_FINISHINGS_FOLD_ACCORDIAN = 90,  /* Accordian-fold the paper vertically into four sections */
+  IPP_FINISHINGS_PUNCH_MULTIPLE_LEFT,  /* Punch multiple holes left side */
+  IPP_FINISHINGS_PUNCH_MULTIPLE_TOP,   /* Punch multiple holes top edge */
+  IPP_FINISHINGS_PUNCH_MULTIPLE_RIGHT, /* Punch multiple holes right side */
+  IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM,        /* Punch multiple holes bottom edge */
+  IPP_FINISHINGS_FOLD_ACCORDION = 90,  /* Accordion-fold the paper vertically into four sections */
   IPP_FINISHINGS_FOLD_DOUBLE_GATE,     /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically */
   IPP_FINISHINGS_FOLD_GATE,            /* Fold the top and bottom quarters of the paper towards the midline */
   IPP_FINISHINGS_FOLD_HALF,            /* Fold the paper in half vertically */
@@ -184,8 +184,8 @@ typedef enum ipp_finishings_e               /**** Finishings values ****/
   IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT,        /* Punch 4 holes right side @exclude all@ */
   IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM,/* Punch 4 holes bottom edge @exclude all@ */
 
-  IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN = 0x4000005A,
-                                       /* Accordian-fold the paper vertically into four sections @exclude all@ */
+  IPP_FINISHINGS_CUPS_FOLD_ACCORDION = 0x4000005A,
+                                       /* Accordion-fold the paper vertically into four sections @exclude all@ */
   IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE,        /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically @exclude all@ */
   IPP_FINISHINGS_CUPS_FOLD_GATE,       /* Fold the top and bottom quarters of the paper towards the midline @exclude all@ */
   IPP_FINISHINGS_CUPS_FOLD_HALF,       /* Fold the paper in half vertically @exclude all@ */
@@ -198,8 +198,10 @@ typedef enum ipp_finishings_e              /**** Finishings values ****/
   IPP_FINISHINGS_CUPS_FOLD_Z           /* Fold the paper vertically into three sections, forming a Z @exclude all@ */
 } ipp_finishings_t;
 #  ifndef _CUPS_NO_DEPRECATED
+#    define IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN IPP_FINISHINGS_CUPS_FOLD_ACCORDION
+#    define IPP_FINISHINGS_FOLD_ACCORDIAN IPP_FINISHINGS_FOLD_ACCORDION
 #    define IPP_FINISHINGS_JOB_OFFSET  IPP_FINISHINGS_JOG_OFFSET
-                                       /* Long-time misspelling... */
+                                       /* Long-time misspellings... */
 typedef enum ipp_finishings_e ipp_finish_t;
 #  endif /* !_CUPS_NO_DEPRECATED */
 
index c3b2768..a94646c 100644 (file)
@@ -43,7 +43,7 @@
 #include "md5-internal.h"
 #include "string-private.h"
 
-#if !defined(__APPLE__) && !defined(HAVE_GNUTLS)
+#if !defined(__APPLE__)
 #  define T1 0xd76aa478
 #  define T2 0xe8c7b756
 #  define T3 0x242070db
@@ -338,4 +338,4 @@ _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16])
     for (i = 0; i < 16; ++i)
        digest[i] = (unsigned char)(pms->abcd[i >> 2] >> ((i & 3) << 3));
 }
-#endif /* !__APPLE__ && !HAVE_GNUTLS */
+#endif /* !__APPLE__ */
index b9b0e5a..8bffb2b 100644 (file)
@@ -664,6 +664,9 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
        {
           switch (cparam->type)
          {
+           case PPD_CUSTOM_UNKNOWN :
+               break;
+
            case PPD_CUSTOM_CURVE :
            case PPD_CUSTOM_INVCURVE :
            case PPD_CUSTOM_POINTS :
@@ -710,6 +713,9 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
        {
           switch (cparam->type)
          {
+           case PPD_CUSTOM_UNKNOWN :
+               break;
+
            case PPD_CUSTOM_CURVE :
            case PPD_CUSTOM_INVCURVE :
            case PPD_CUSTOM_POINTS :
@@ -805,6 +811,9 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
              {
                switch (cparam->type)
                {
+                 case PPD_CUSTOM_UNKNOWN :
+                     break;
+
                  case PPD_CUSTOM_CURVE :
                  case PPD_CUSTOM_INVCURVE :
                  case PPD_CUSTOM_POINTS :
@@ -1007,6 +1016,9 @@ ppdEmitString(ppd_file_t    *ppd, /* I - PPD file record */
        {
           switch (cparam->type)
          {
+           case PPD_CUSTOM_UNKNOWN :
+               break;
+
            case PPD_CUSTOM_CURVE :
            case PPD_CUSTOM_INVCURVE :
            case PPD_CUSTOM_POINTS :
index 9eca0ce..7ec0df4 100644 (file)
@@ -851,6 +851,9 @@ ppd_mark_option(ppd_file_t *ppd,    /* I - PPD file */
 
         switch (cparam->type)
        {
+         case PPD_CUSTOM_UNKNOWN :
+             break;
+
          case PPD_CUSTOM_CURVE :
          case PPD_CUSTOM_INVCURVE :
          case PPD_CUSTOM_REAL :
@@ -928,6 +931,9 @@ ppd_mark_option(ppd_file_t *ppd,    /* I - PPD file */
 
        switch (cparam->type)
        {
+         case PPD_CUSTOM_UNKNOWN :
+             break;
+
          case PPD_CUSTOM_CURVE :
          case PPD_CUSTOM_INVCURVE :
          case PPD_CUSTOM_REAL :
index 8622011..ff52df2 100644 (file)
@@ -705,6 +705,8 @@ _ppdOpen(
           strncmp(ll, keyword, ll_len)))
       {
        DEBUG_printf(("2_ppdOpen: Ignoring localization: \"%s\"\n", keyword));
+       free(string);
+       string = NULL;
        continue;
       }
       else if (localization == _PPD_LOCALIZATION_ICC_PROFILES)
@@ -724,6 +726,8 @@ _ppdOpen(
        if (i >= (int)(sizeof(color_keywords) / sizeof(color_keywords[0])))
        {
          DEBUG_printf(("2_ppdOpen: Ignoring localization: \"%s\"\n", keyword));
+         free(string);
+         string = NULL;
          continue;
        }
       }
@@ -988,6 +992,13 @@ _ppdOpen(
        goto error;
       }
 
+      if (cparam->type != PPD_CUSTOM_UNKNOWN)
+      {
+        pg->ppd_status = PPD_BAD_CUSTOM_PARAM;
+
+        goto error;
+      }
+
      /*
       * Get the parameter data...
       */
@@ -1861,6 +1872,13 @@ _ppdOpen(
     }
     else if (!strcmp(keyword, "PaperDimension"))
     {
+      if (!_cups_strcasecmp(name, "custom") || !_cups_strncasecmp(name, "custom.", 7))
+      {
+        char cname[PPD_MAX_NAME];      /* Rewrite with a leading underscore */
+        snprintf(cname, sizeof(cname), "_%s", name);
+        strlcpy(name, cname, sizeof(name));
+      }
+
       if ((size = ppdPageSize(ppd, name)) == NULL)
        size = ppd_add_size(ppd, name);
 
@@ -1883,6 +1901,13 @@ _ppdOpen(
     }
     else if (!strcmp(keyword, "ImageableArea"))
     {
+      if (!_cups_strcasecmp(name, "custom") || !_cups_strncasecmp(name, "custom.", 7))
+      {
+        char cname[PPD_MAX_NAME];      /* Rewrite with a leading underscore */
+        snprintf(cname, sizeof(cname), "_%s", name);
+        strlcpy(name, cname, sizeof(name));
+      }
+
       if ((size = ppdPageSize(ppd, name)) == NULL)
        size = ppd_add_size(ppd, name);
 
@@ -1912,6 +1937,13 @@ _ppdOpen(
     {
       DEBUG_printf(("2_ppdOpen: group=%p, subgroup=%p", group, subgroup));
 
+      if (!_cups_strcasecmp(name, "custom") || !_cups_strncasecmp(name, "custom.", 7))
+      {
+        char cname[PPD_MAX_NAME];      /* Rewrite with a leading underscore */
+        snprintf(cname, sizeof(cname), "_%s", name);
+        strlcpy(name, cname, sizeof(name));
+      }
+
       if (!strcmp(keyword, "PageSize"))
       {
        /*
@@ -2636,6 +2668,7 @@ ppd_get_cparam(ppd_coption_t *opt,        /* I - PPD file */
   if ((cparam = calloc(1, sizeof(ppd_cparam_t))) == NULL)
     return (NULL);
 
+  cparam->type = PPD_CUSTOM_UNKNOWN;
   strlcpy(cparam->name, param, sizeof(cparam->name));
   strlcpy(cparam->text, text[0] ? text : param, sizeof(cparam->text));
 
index 108f20e..f2ba50d 100644 (file)
@@ -226,6 +226,7 @@ typedef struct ppd_profile_s                /**** sRGB Color Profiles @deprecated@ ****/
 /**** New in CUPS 1.2/macOS 10.5 ****/
 typedef enum ppd_cptype_e              /**** Custom Parameter Type @deprecated@ ****/
 {
+  PPD_CUSTOM_UNKNOWN = -1,             /* Unknown type (error) */
   PPD_CUSTOM_CURVE,                    /* Curve value for f(x) = x^value */
   PPD_CUSTOM_INT,                      /* Integer number value */
   PPD_CUSTOM_INVCURVE,                 /* Curve value for f(x) = x^(1/value) */
index b43123a..56a5d01 100644 (file)
@@ -1,10 +1,11 @@
 /*
  * Side-channel API code for CUPS.
  *
- * Copyright 2007-2014 by Apple Inc.
- * Copyright 2006 by Easy Software Products.
+ * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2006 by Easy Software Products.
  *
- * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
  */
 
 /*
@@ -589,8 +590,8 @@ cupsSideChannelWrite(
   if ((buffer = _cupsBufferGet((size_t)datalen + 4)) == NULL)
     return (-1);
 
-  buffer[0] = command;
-  buffer[1] = status;
+  buffer[0] = (char)command;
+  buffer[1] = (char)status;
   buffer[2] = (char)(datalen >> 8);
   buffer[3] = (char)(datalen & 255);
 
index 5cefee4..6da119d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SNMP functions for CUPS.
  *
- * Copyright © 2007-2014 by Apple Inc.
+ * Copyright © 2007-2019 by Apple Inc.
  * Copyright © 2006-2007 by Easy Software Products, all rights reserved.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -1167,7 +1167,7 @@ asn1_encode_snmp(unsigned char *buffer,   /* I - Buffer */
   memcpy(bufptr, packet->community, commlen);
   bufptr += commlen;
 
-  *bufptr++ = packet->request_type;    /* Get-Request-PDU/Get-Next-Request-PDU */
+  *bufptr++ = (unsigned char)packet->request_type;     /* Get-Request-PDU/Get-Next-Request-PDU */
   asn1_set_length(&bufptr, reqlen);
 
   asn1_set_integer(&bufptr, (int)packet->request_id);
@@ -1233,6 +1233,9 @@ asn1_get_integer(
   int  value;                          /* Integer value */
 
 
+  if (*buffer >= bufend)
+    return (0);
+
   if (length > sizeof(int))
   {
     (*buffer) += length;
@@ -1259,6 +1262,9 @@ asn1_get_length(unsigned char **buffer,   /* IO - Pointer in buffer */
   unsigned     length;                 /* Length */
 
 
+  if (*buffer >= bufend)
+    return (0);
+
   length = **buffer;
   (*buffer) ++;
 
@@ -1301,6 +1307,9 @@ asn1_get_oid(
   int          number;                 /* OID number */
 
 
+  if (*buffer >= bufend)
+    return (0);
+
   valend = *buffer + length;
   oidptr = oid;
   oidend = oid + oidsize - 1;
@@ -1349,9 +1358,12 @@ asn1_get_packed(
   int  value;                          /* Value */
 
 
+  if (*buffer >= bufend)
+    return (0);
+
   value = 0;
 
-  while ((**buffer & 128) && *buffer < bufend)
+  while (*buffer < bufend && (**buffer & 128))
   {
     value = (value << 7) | (**buffer & 127);
     (*buffer) ++;
@@ -1379,6 +1391,9 @@ asn1_get_string(
     char          *string,             /* I  - String buffer */
     size_t        strsize)             /* I  - String buffer size */
 {
+  if (*buffer >= bufend)
+    return (NULL);
+
   if (length > (unsigned)(bufend - *buffer))
     length = (unsigned)(bufend - *buffer);
 
@@ -1421,6 +1436,9 @@ asn1_get_type(unsigned char **buffer,     /* IO - Pointer in buffer */
   int  type;                           /* Type */
 
 
+  if (*buffer >= bufend)
+    return (0);
+
   type = **buffer;
   (*buffer) ++;
 
index 3514b94..aad53e4 100644 (file)
@@ -1,10 +1,11 @@
 /*
  * IPP test program for CUPS.
  *
- * Copyright © 2007-2018 by Apple Inc.
+ * Copyright © 2007-2019 by Apple Inc.
  * Copyright © 1997-2005 by Easy Software Products.
  *
- * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
  */
 
 /*
@@ -44,7 +45,7 @@ static ipp_uchar_t collection[] =     /* Collection buffer */
                  0x01, 0x01,           /* IPP version */
                  0x00, 0x02,           /* Print-Job operation */
                  0x00, 0x00, 0x00, 0x01,
-                                       /* Request ID */
+                                       /* Request ID */
 
                  IPP_TAG_OPERATION,
 
@@ -74,7 +75,7 @@ static ipp_uchar_t collection[] =     /* Collection buffer */
                  IPP_TAG_JOB,          /* job group tag */
 
                  IPP_TAG_BEGIN_COLLECTION,
-                                       /* begCollection tag */
+                                       /* begCollection tag */
                  0x00, 0x09,           /* Name length + name */
                  'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l',
                  0x00, 0x00,           /* No value */
@@ -83,11 +84,11 @@ static ipp_uchar_t collection[] =   /* Collection buffer */
                    0x00, 0x0a,         /* Value length + value */
                    'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e',
                    IPP_TAG_BEGIN_COLLECTION,
-                                       /* begCollection tag */
+                                       /* begCollection tag */
                    0x00, 0x00,         /* Name length + name */
                    0x00, 0x00,         /* No value */
                      IPP_TAG_MEMBERNAME,
-                                       /* memberAttrName tag */
+                                       /* memberAttrName tag */
                      0x00, 0x00,       /* No name */
                      0x00, 0x0b,       /* Value length + value */
                      'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
@@ -96,7 +97,7 @@ static ipp_uchar_t collection[] =     /* Collection buffer */
                      0x00, 0x04,       /* Value length + value */
                      0x00, 0x00, 0x54, 0x56,
                      IPP_TAG_MEMBERNAME,
-                                       /* memberAttrName tag */
+                                       /* memberAttrName tag */
                      0x00, 0x00,       /* No name */
                      0x00, 0x0b,       /* Value length + value */
                      'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
@@ -105,7 +106,7 @@ static ipp_uchar_t collection[] =   /* Collection buffer */
                      0x00, 0x04,       /* Value length + value */
                      0x00, 0x00, 0x6d, 0x24,
                    IPP_TAG_END_COLLECTION,
-                                       /* endCollection tag */
+                                       /* endCollection tag */
                    0x00, 0x00,         /* No name */
                    0x00, 0x00,         /* No value */
                    IPP_TAG_MEMBERNAME, /* memberAttrName tag */
@@ -126,12 +127,12 @@ static ipp_uchar_t collection[] = /* Collection buffer */
                    0x00, 0x05,         /* Value length + value */
                    'p', 'l', 'a', 'i', 'n',
                  IPP_TAG_END_COLLECTION,
-                                       /* endCollection tag */
+                                       /* endCollection tag */
                  0x00, 0x00,           /* No name */
                  0x00, 0x00,           /* No value */
 
                  IPP_TAG_BEGIN_COLLECTION,
-                                       /* begCollection tag */
+                                       /* begCollection tag */
                  0x00, 0x00,           /* No name */
                  0x00, 0x00,           /* No value */
                    IPP_TAG_MEMBERNAME, /* memberAttrName tag */
@@ -139,11 +140,11 @@ static ipp_uchar_t collection[] = /* Collection buffer */
                    0x00, 0x0a,         /* Value length + value */
                    'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e',
                    IPP_TAG_BEGIN_COLLECTION,
-                                       /* begCollection tag */
+                                       /* begCollection tag */
                    0x00, 0x00,         /* Name length + name */
                    0x00, 0x00,         /* No value */
                      IPP_TAG_MEMBERNAME,
-                                       /* memberAttrName tag */
+                                       /* memberAttrName tag */
                      0x00, 0x00,       /* No name */
                      0x00, 0x0b,       /* Value length + value */
                      'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
@@ -152,7 +153,7 @@ static ipp_uchar_t collection[] =   /* Collection buffer */
                      0x00, 0x04,       /* Value length + value */
                      0x00, 0x00, 0x52, 0x08,
                      IPP_TAG_MEMBERNAME,
-                                       /* memberAttrName tag */
+                                       /* memberAttrName tag */
                      0x00, 0x00,       /* No name */
                      0x00, 0x0b,       /* Value length + value */
                      'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
@@ -161,7 +162,7 @@ static ipp_uchar_t collection[] =   /* Collection buffer */
                      0x00, 0x04,       /* Value length + value */
                      0x00, 0x00, 0x74, 0x04,
                    IPP_TAG_END_COLLECTION,
-                                       /* endCollection tag */
+                                       /* endCollection tag */
                    0x00, 0x00,         /* No name */
                    0x00, 0x00,         /* No value */
                    IPP_TAG_MEMBERNAME, /* memberAttrName tag */
@@ -182,7 +183,72 @@ static ipp_uchar_t collection[] =  /* Collection buffer */
                    0x00, 0x06,         /* Value length + value */
                    'g', 'l', 'o', 's', 's', 'y',
                  IPP_TAG_END_COLLECTION,
-                                       /* endCollection tag */
+                                       /* endCollection tag */
+                 0x00, 0x00,           /* No name */
+                 0x00, 0x00,           /* No value */
+
+                 IPP_TAG_END           /* end tag */
+               };
+static ipp_uchar_t bad_collection[] =  /* Collection buffer (bad encoding) */
+               {
+                 0x01, 0x01,           /* IPP version */
+                 0x00, 0x02,           /* Print-Job operation */
+                 0x00, 0x00, 0x00, 0x01,
+                                       /* Request ID */
+
+                 IPP_TAG_OPERATION,
+
+                 IPP_TAG_CHARSET,
+                 0x00, 0x12,           /* Name length + name */
+                 'a','t','t','r','i','b','u','t','e','s','-',
+                 'c','h','a','r','s','e','t',
+                 0x00, 0x05,           /* Value length + value */
+                 'u','t','f','-','8',
+
+                 IPP_TAG_LANGUAGE,
+                 0x00, 0x1b,           /* Name length + name */
+                 'a','t','t','r','i','b','u','t','e','s','-',
+                 'n','a','t','u','r','a','l','-','l','a','n',
+                 'g','u','a','g','e',
+                 0x00, 0x02,           /* Value length + value */
+                 'e','n',
+
+                 IPP_TAG_URI,
+                 0x00, 0x0b,           /* Name length + name */
+                 'p','r','i','n','t','e','r','-','u','r','i',
+                 0x00, 0x1c,                   /* Value length + value */
+                 'i','p','p',':','/','/','l','o','c','a','l',
+                 'h','o','s','t','/','p','r','i','n','t','e',
+                 'r','s','/','f','o','o',
+
+                 IPP_TAG_JOB,          /* job group tag */
+
+                 IPP_TAG_BEGIN_COLLECTION,
+                                       /* begCollection tag */
+                 0x00, 0x09,           /* Name length + name */
+                 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l',
+                 0x00, 0x00,           /* No value */
+                   IPP_TAG_BEGIN_COLLECTION,
+                                       /* begCollection tag */
+                   0x00, 0x0a,         /* Name length + name */
+                   'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e',
+                   0x00, 0x00,         /* No value */
+                     IPP_TAG_INTEGER,  /* integer tag */
+                     0x00, 0x0b,       /* Name length + name */
+                     'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
+                     0x00, 0x04,       /* Value length + value */
+                     0x00, 0x00, 0x54, 0x56,
+                     IPP_TAG_INTEGER,  /* integer tag */
+                     0x00, 0x0b,       /* Name length + name */
+                     'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
+                     0x00, 0x04,       /* Value length + value */
+                     0x00, 0x00, 0x6d, 0x24,
+                   IPP_TAG_END_COLLECTION,
+                                       /* endCollection tag */
+                   0x00, 0x00,         /* No name */
+                   0x00, 0x00,         /* No value */
+                 IPP_TAG_END_COLLECTION,
+                                       /* endCollection tag */
                  0x00, 0x00,           /* No name */
                  0x00, 0x00,           /* No value */
 
@@ -194,7 +260,7 @@ static ipp_uchar_t mixed[] =                /* Mixed value buffer */
                  0x01, 0x01,           /* IPP version */
                  0x00, 0x02,           /* Print-Job operation */
                  0x00, 0x00, 0x00, 0x01,
-                                       /* Request ID */
+                                       /* Request ID */
 
                  IPP_TAG_OPERATION,
 
@@ -223,6 +289,7 @@ static ipp_uchar_t mixed[] =                /* Mixed value buffer */
 void   hex_dump(const char *title, ipp_uchar_t *buffer, size_t bytes);
 void   print_attributes(ipp_t *ipp, int indent);
 ssize_t        read_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes);
+ssize_t        read_hex(cups_file_t *fp, ipp_uchar_t *buffer, size_t bytes);
 int    token_cb(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, const char *token);
 ssize_t        write_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes);
 
@@ -584,12 +651,33 @@ main(int  argc,                   /* I - Number of command-line arguments */
 
     ippDelete(request);
 
+   /*
+    * Read the bad collection data and confirm we get an error...
+    */
+
+    fputs("Read Bad Collection from Memory: ", stdout);
+
+    request = ippNew();
+    data.rpos    = 0;
+    data.wused   = sizeof(bad_collection);
+    data.wsize   = sizeof(bad_collection);
+    data.wbuffer = bad_collection;
+
+    while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, request)) != IPP_STATE_DATA)
+      if (state == IPP_STATE_ERROR)
+       break;
+
+    if (state != IPP_STATE_ERROR)
+      puts("FAIL (read successful)");
+    else
+      puts("PASS");
+
    /*
     * Read the mixed data and confirm we converted everything to rangeOfInteger
     * values...
     */
 
-    printf("Read Mixed integer/rangeOfInteger from Memory: ");
+    fputs("Read Mixed integer/rangeOfInteger from Memory: ", stdout);
 
     request = ippNew();
     data.rpos    = 0;
@@ -719,6 +807,33 @@ main(int  argc,                    /* I - Number of command-line arguments */
         request = _ippFileParse(&v, argv[i], NULL);
         _ippVarsDeinit(&v);
       }
+      else if (strlen(argv[i]) > 4 && !strcmp(argv[i] + strlen(argv[i]) - 4, ".hex"))
+      {
+       /*
+        * Read a hex-encoded IPP message...
+        */
+
+       if ((fp = cupsFileOpen(argv[i], "r")) == NULL)
+       {
+         printf("Unable to open \"%s\" - %s\n", argv[i], strerror(errno));
+         status = 1;
+         continue;
+       }
+
+       request = ippNew();
+       while ((state = ippReadIO(fp, (ipp_iocb_t)read_hex, 1, NULL, request)) == IPP_STATE_ATTRIBUTE);
+
+       if (state != IPP_STATE_DATA)
+       {
+         printf("Error reading IPP message from \"%s\": %s\n", argv[i], cupsLastErrorString());
+         status = 1;
+
+         ippDelete(request);
+         request = NULL;
+       }
+
+        cupsFileClose(fp);
+      }
       else
       {
        /*
@@ -886,6 +1001,48 @@ read_cb(_ippdata_t   *data,               /* I - Data */
 }
 
 
+/*
+ * 'read_hex()' - Read a hex dump of an IPP request.
+ */
+
+ssize_t                                        /* O - Number of bytes read */
+read_hex(cups_file_t *fp,              /* I - File to read from */
+         ipp_uchar_t *buffer,          /* I - Buffer to read */
+         size_t      bytes)            /* I - Number of bytes to read */
+{
+  size_t       total = 0;              /* Total bytes read */
+  static char  hex[256] = "";          /* Line from file */
+  static char  *hexptr = NULL;         /* Pointer in line */
+
+
+  while (total < bytes)
+  {
+    if (!hexptr || (isspace(hexptr[0] & 255) && isspace(hexptr[1] & 255)))
+    {
+      if (!cupsFileGets(fp, hex, sizeof(hex)))
+        break;
+
+      hexptr = hex;
+      while (isxdigit(*hexptr & 255))
+        hexptr ++;
+      while (isspace(*hexptr & 255))
+        hexptr ++;
+
+      if (!isxdigit(*hexptr & 255))
+      {
+        hexptr = NULL;
+        continue;
+      }
+    }
+
+    *buffer++ = (ipp_uchar_t)strtol(hexptr, &hexptr, 16);
+    total ++;
+  }
+
+  return (total == 0 ? -1 : (ssize_t)total);
+}
+
+
 /*
  * 'token_cb()' - Token callback for ASCII IPP data file parser.
  */
index 914abbd..36707f2 100644 (file)
@@ -1245,6 +1245,10 @@ main(int  argc,                          /* I - Number of command-line arguments */
             {
              switch (cparam->type)
              {
+               case PPD_CUSTOM_UNKNOWN :
+                   printf("              %s(%s): PPD_CUSTOM_UNKNOWN (error)\n", cparam->name, cparam->text);
+                   break;
+
                case PPD_CUSTOM_CURVE :
                    printf("              %s(%s): PPD_CUSTOM_CURVE (%g to %g)\n",
                           cparam->name, cparam->text,
diff --git a/cups/testthreads.c b/cups/testthreads.c
new file mode 100644 (file)
index 0000000..441bc9f
--- /dev/null
@@ -0,0 +1,268 @@
+/*
+ * Threaded test program for CUPS.
+ *
+ * Copyright © 2012-2019 by Apple Inc.
+ *
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <cups/cups.h>
+#include <cups/thread-private.h>
+
+
+/*
+ * Local functions...
+ */
+
+static int     enum_dests_cb(void *_name, unsigned flags, cups_dest_t *dest);
+static void    *run_query(cups_dest_t *dest);
+static void    show_supported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);
+
+
+/*
+ * 'main()' - Main entry.
+ */
+
+int                                    /* O - Exit status */
+main(int  argc,                                /* I - Number of command-line arguments */
+     char *argv[])                     /* I - Command-line arguments */
+{
+ /*
+  * Go through all the available destinations to find the requested one...
+  */
+
+  (void)argc;
+
+  cupsEnumDests(CUPS_DEST_FLAGS_NONE, -1, NULL, 0, 0, enum_dests_cb, argv[1]);
+
+  return (0);
+}
+
+
+/*
+ * 'enum_dests_cb()' - Destination enumeration function...
+ */
+
+static int                             /* O - 1 to continue, 0 to stop */
+enum_dests_cb(void        *_name,      /* I - Printer name, if any */
+              unsigned    flags,       /* I - Enumeration flags */
+              cups_dest_t *dest)       /* I - Found destination */
+{
+  const char           *name = (const char *)_name;
+                                       /* Printer name */
+  cups_dest_t          *cdest;         /* Copied destination */
+
+
+  (void)flags;
+
+ /*
+  * If a name was specified, compare it...
+  */
+
+  if (name && strcasecmp(name, dest->name))
+    return (1);                                /* Continue */
+
+ /*
+  * Copy the destination and run the query on a separate thread...
+  */
+
+  cupsCopyDest(dest, 0, &cdest);
+  _cupsThreadWait(_cupsThreadCreate((_cups_thread_func_t)run_query, cdest));
+
+  cupsFreeDests(1, cdest);
+
+ /*
+  * Continue if no name was specified or the name matches...
+  */
+
+  return (!name || !strcasecmp(name, dest->name));
+}
+
+
+/*
+ * 'run_query()' - Query printer capabilities on a separate thread.
+ */
+
+static void *                          /* O - Return value (not used) */
+run_query(cups_dest_t *dest)           /* I - Destination to query */
+{
+  http_t       *http;                  /* Connection to destination */
+  cups_dinfo_t *dinfo;                 /* Destination info */
+  unsigned     dflags = CUPS_DEST_FLAGS_NONE;
+                                       /* Destination flags */
+
+
+  if ((http = cupsConnectDest(dest, dflags, 300, NULL, NULL, 0, NULL, NULL)) == NULL)
+  {
+    printf("testthreads: Unable to connect to destination \"%s\": %s\n", dest->name, cupsLastErrorString());
+    return (NULL);
+  }
+
+  if ((dinfo = cupsCopyDestInfo(http, dest)) == NULL)
+  {
+    printf("testdest: Unable to get information for destination \"%s\": %s\n", dest->name, cupsLastErrorString());
+    return (NULL);
+  }
+
+  printf("\n%s:\n", dest->name);
+
+  show_supported(http, dest, dinfo, NULL, NULL);
+
+  return (NULL);
+}
+
+
+
+/*
+ * 'show_supported()' - Show supported options, values, etc.
+ */
+
+static void
+show_supported(http_t       *http,     /* I - Connection to destination */
+              cups_dest_t  *dest,      /* I - Destination */
+              cups_dinfo_t *dinfo,     /* I - Destination information */
+              const char   *option,    /* I - Option, if any */
+              const char   *value)     /* I - Value, if any */
+{
+  ipp_attribute_t      *attr;          /* Attribute */
+  int                  i,              /* Looping var */
+                       count;          /* Number of values */
+
+
+  if (!option)
+  {
+    attr = cupsFindDestSupported(http, dest, dinfo, "job-creation-attributes");
+    if (attr)
+    {
+      count = ippGetCount(attr);
+      for (i = 0; i < count; i ++)
+        show_supported(http, dest, dinfo, ippGetString(attr, i, NULL), NULL);
+    }
+    else
+    {
+      static const char * const options[] =
+      {                                        /* List of standard options */
+        CUPS_COPIES,
+       CUPS_FINISHINGS,
+       CUPS_MEDIA,
+       CUPS_NUMBER_UP,
+       CUPS_ORIENTATION,
+       CUPS_PRINT_COLOR_MODE,
+       CUPS_PRINT_QUALITY,
+       CUPS_SIDES
+      };
+
+      puts("    No job-creation-attributes-supported attribute, probing instead.");
+
+      for (i = 0; i < (int)(sizeof(options) / sizeof(options[0])); i ++)
+        if (cupsCheckDestSupported(http, dest, dinfo, options[i], NULL))
+         show_supported(http, dest, dinfo, options[i], NULL);
+    }
+  }
+  else if (!value)
+  {
+    printf("    %s (%s - %s)\n", option, cupsLocalizeDestOption(http, dest, dinfo, option), cupsCheckDestSupported(http, dest, dinfo, option, NULL) ? "supported" : "not-supported");
+
+    if ((attr = cupsFindDestSupported(http, dest, dinfo, option)) != NULL)
+    {
+      count = ippGetCount(attr);
+
+      switch (ippGetValueTag(attr))
+      {
+        case IPP_TAG_INTEGER :
+           for (i = 0; i < count; i ++)
+              printf("        %d\n", ippGetInteger(attr, i));
+           break;
+
+        case IPP_TAG_ENUM :
+           for (i = 0; i < count; i ++)
+           {
+             int val = ippGetInteger(attr, i);
+             char valstr[256];
+
+              snprintf(valstr, sizeof(valstr), "%d", val);
+              printf("        %s (%s)\n", ippEnumString(option, ippGetInteger(attr, i)), cupsLocalizeDestValue(http, dest, dinfo, option, valstr));
+            }
+           break;
+
+        case IPP_TAG_RANGE :
+           for (i = 0; i < count; i ++)
+           {
+             int upper, lower = ippGetRange(attr, i, &upper);
+
+              printf("        %d-%d\n", lower, upper);
+           }
+           break;
+
+        case IPP_TAG_RESOLUTION :
+           for (i = 0; i < count; i ++)
+           {
+             int xres, yres;
+             ipp_res_t units;
+             xres = ippGetResolution(attr, i, &yres, &units);
+
+              if (xres == yres)
+                printf("        %d%s\n", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+             else
+                printf("        %dx%d%s\n", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+           }
+           break;
+
+       case IPP_TAG_KEYWORD :
+           for (i = 0; i < count; i ++)
+              printf("        %s (%s)\n", ippGetString(attr, i, NULL), cupsLocalizeDestValue(http, dest, dinfo, option, ippGetString(attr, i, NULL)));
+           break;
+
+       case IPP_TAG_TEXTLANG :
+       case IPP_TAG_NAMELANG :
+       case IPP_TAG_TEXT :
+       case IPP_TAG_NAME :
+       case IPP_TAG_URI :
+       case IPP_TAG_URISCHEME :
+       case IPP_TAG_CHARSET :
+       case IPP_TAG_LANGUAGE :
+       case IPP_TAG_MIMETYPE :
+           for (i = 0; i < count; i ++)
+              printf("        %s\n", ippGetString(attr, i, NULL));
+           break;
+
+        case IPP_TAG_STRING :
+           for (i = 0; i < count; i ++)
+           {
+             int j, len;
+             unsigned char *data = ippGetOctetString(attr, i, &len);
+
+              fputs("        ", stdout);
+             for (j = 0; j < len; j ++)
+             {
+               if (data[j] < ' ' || data[j] >= 0x7f)
+                 printf("<%02X>", data[j]);
+               else
+                 putchar(data[j]);
+              }
+              putchar('\n');
+           }
+           break;
+
+        case IPP_TAG_BOOLEAN :
+           break;
+
+        default :
+           printf("        %s\n", ippTagString(ippGetValueTag(attr)));
+           break;
+      }
+    }
+
+  }
+  else if (cupsCheckDestSupported(http, dest, dinfo, option, value))
+    puts("YES");
+  else
+    puts("NO");
+}
index f18ff21..e8c4fb7 100644 (file)
  */
 
 #include <spawn.h>
-
-extern char **environ;
-
-
-#ifndef _SECURITY_VERSION_GREATER_THAN_57610_
-typedef CF_OPTIONS(uint32_t, SecKeyUsage) {
-    kSecKeyUsageAll              = 0x7FFFFFFF
-};
-#endif /* !_SECURITY_VERSION_GREATER_THAN_57610_ */
-extern const void * kSecCSRChallengePassword;
-extern const void * kSecSubjectAltName;
-extern const void * kSecCertificateKeyUsage;
-extern const void * kSecCSRBasicContraintsPathLen;
-extern const void * kSecCertificateExtensions;
-extern const void * kSecCertificateExtensionsEncoded;
-extern const void * kSecOidCommonName;
-extern const void * kSecOidCountryName;
-extern const void * kSecOidStateProvinceName;
-extern const void * kSecOidLocalityName;
-extern const void * kSecOidOrganization;
-extern const void * kSecOidOrganizationalUnit;
-extern bool SecCertificateIsValid(SecCertificateRef certificate, CFAbsoluteTime verifyTime);
-extern CFAbsoluteTime SecCertificateNotValidAfter(SecCertificateRef certificate);
-extern SecCertificateRef SecGenerateSelfSignedCertificate(CFArrayRef subject, CFDictionaryRef parameters, SecKeyRef publicKey, SecKeyRef privateKey);
-extern SecIdentityRef SecIdentityCreate(CFAllocatorRef allocator, SecCertificateRef certificate, SecKeyRef privateKey);
-
+#include "tls-darwin.h"
 
 /*
  * Constants, very secure stuff...
diff --git a/cups/tls-darwin.h b/cups/tls-darwin.h
new file mode 100644 (file)
index 0000000..ca4136e
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * TLS support header for CUPS on macOS.
+ *
+ * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
+ */
+
+/**** This file is included from tls-darwin.c ****/
+
+extern char **environ;
+
+#ifndef _SECURITY_VERSION_GREATER_THAN_57610_
+typedef CF_OPTIONS(uint32_t, SecKeyUsage) {
+    kSecKeyUsageAll              = 0x7FFFFFFF
+};
+#endif /* !_SECURITY_VERSION_GREATER_THAN_57610_ */
+extern const void * kSecCSRChallengePassword;
+extern const void * kSecSubjectAltName;
+extern const void * kSecCertificateKeyUsage;
+extern const void * kSecCSRBasicContraintsPathLen;
+extern const void * kSecCertificateExtensions;
+extern const void * kSecCertificateExtensionsEncoded;
+extern const void * kSecOidCommonName;
+extern const void * kSecOidCountryName;
+extern const void * kSecOidStateProvinceName;
+extern const void * kSecOidLocalityName;
+extern const void * kSecOidOrganization;
+extern const void * kSecOidOrganizationalUnit;
+extern bool SecCertificateIsValid(SecCertificateRef certificate, CFAbsoluteTime verifyTime);
+extern CFAbsoluteTime SecCertificateNotValidAfter(SecCertificateRef certificate);
+extern SecCertificateRef SecGenerateSelfSignedCertificate(CFArrayRef subject, CFDictionaryRef parameters, SecKeyRef publicKey, SecKeyRef privateKey);
+extern SecIdentityRef SecIdentityCreate(CFAllocatorRef allocator, SecCertificateRef certificate, SecKeyRef privateKey);
index aae2138..14c218f 100644 (file)
 #    define _CUPS_API_1_7 API_AVAILABLE(macos(10.9), ios(11.0)) _CUPS_PUBLIC
 #    define _CUPS_API_2_0 API_AVAILABLE(macos(10.10), ios(11.0)) _CUPS_PUBLIC
 #    define _CUPS_API_2_2 API_AVAILABLE(macos(10.12), ios(11.0)) _CUPS_PUBLIC
-#    define _CUPS_API_2_2_4 API_AVAILABLE(macos(10.13), ios(11.0)) _CUPS_PUBLIC
-#    define _CUPS_API_2_2_7 API_AVAILABLE(macos(10.14), ios(11.0)) _CUPS_PUBLIC
-#    define _CUPS_API_2_3 _CUPS_PUBLIC
+#    define _CUPS_API_2_2_4 API_AVAILABLE(macos(10.13), ios(12.0)) _CUPS_PUBLIC
+#    define _CUPS_API_2_2_7 API_AVAILABLE(macos(10.14), ios(13.0)) _CUPS_PUBLIC
+#    define _CUPS_API_2_3 API_AVAILABLE(macos(10.14), ios(13.0)) _CUPS_PUBLIC
 #  else
 #    define _CUPS_API_1_1_19 _CUPS_PUBLIC
 #    define _CUPS_API_1_1_20 _CUPS_PUBLIC
index f9969d4..7e6b407 100644 (file)
@@ -5,7 +5,7 @@
     <title>Administration APIs</title>
     <meta name="keywords" content="Programming">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Unknown">
     <meta name="copyright" content="Unknown">
     <meta name="version" content="0.0">
@@ -450,6 +450,7 @@ h3.title {
 --></style>
   </head>
   <body>
+    <div class="header">
 <!--
   Administrative API header for CUPS.
 
@@ -481,6 +482,7 @@ h3.title {
 </tr>
 </tbody>
 </table></div>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
index eddd063..961f462 100644 (file)
@@ -5,7 +5,7 @@
     <title>Filter and Backend Programming</title>
     <meta name="keywords" content="Programming">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Unknown">
     <meta name="copyright" content="Unknown">
     <meta name="version" content="0.0">
@@ -450,6 +450,7 @@ h3.title {
 --></style>
   </head>
   <body>
+    <div class="header">
 <!--
   Filter and backend programming header for CUPS.
 
@@ -487,6 +488,7 @@ h3.title {
 </tr>
 </tbody>
 </table></div>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
index 4ddb11a..623a3a8 100644 (file)
@@ -5,7 +5,7 @@
     <title>PPD API (DEPRECATED)</title>
     <meta name="keywords" content="Programming">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Unknown">
     <meta name="copyright" content="Unknown">
     <meta name="version" content="0.0">
@@ -450,6 +450,7 @@ h3.title {
 --></style>
   </head>
   <body>
+    <div class="header">
 <!--
   PPD API header for CUPS.
 
@@ -486,6 +487,7 @@ h3.title {
 </tr>
 </tbody>
 </table></div>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
@@ -2125,6 +2127,7 @@ typedef enum <a href="#ppd_ui_e">ppd_ui_e</a> ppd_ui_t;
         <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>
index 6eccab7..6a9e763 100644 (file)
@@ -5,7 +5,7 @@
     <title>Raster API</title>
     <meta name="keywords" content="Programming">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Unknown">
     <meta name="copyright" content="Unknown">
     <meta name="version" content="0.0">
@@ -450,6 +450,7 @@ h3.title {
 --></style>
   </head>
   <body>
+    <div class="header">
 <!--
   Raster API documentation for CUPS.
 
@@ -481,6 +482,7 @@ h3.title {
 </tr>
 </tbody>
 </table></div>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
index 5cd742c..1a8c388 100644 (file)
Binary files a/doc/help/cupspm.epub and b/doc/help/cupspm.epub differ
index 4c68087..fa1a876 100644 (file)
@@ -5,91 +5,62 @@
     <title>CUPS Programming Manual</title>
     <meta name="keywords" content="Programming">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Michael R Sweet">
     <meta name="copyright" content="Copyright &#xa9; 2007-2019 by Apple Inc. All Rights Reserved.">
     <meta name="version" content="2.3.0">
     <style type="text/css"><!--
-body, p, h1, h2, h3, h4 {
+body, p, h1, h2, h3, h4, h5, h6 {
   font-family: sans-serif;
+  line-height: 1.4;
 }
-div.body h1 {
-  font-size: 250%;
+h1, h2, h3, h4, h5, h6 {
   font-weight: bold;
+  page-break-inside: avoid;
+}
+h1 {
+  font-size: 250%;
   margin: 0;
 }
-div.body h2 {
+h2 {
   font-size: 250%;
   margin-top: 1.5em;
 }
-div.body h3 {
-  font-size: 150%;
+h3 {
+  font-size: 200%;
   margin-bottom: 0.5em;
   margin-top: 1.5em;
 }
-div.body h4 {
-  font-size: 110%;
+h4 {
+  font-size: 150%;
   margin-bottom: 0.5em;
   margin-top: 1.5em;
 }
-div.body h5 {
-  font-size: 100%;
+h5 {
+  font-size: 125%;
   margin-bottom: 0.5em;
   margin-top: 1.5em;
 }
-div.contents {
-  background: #e8e8e8;
-  border: solid thin black;
-  padding: 10px;
-}
-div.contents h1 {
+h6 {
   font-size: 110%;
+  margin-bottom: 0.5em;
+  margin-top: 1.5em;
 }
-div.contents h2 {
-  font-size: 100%;
+div.header h1, div.header p {
+  text-align: center;
 }
-div.contents ul.contents {
-  font-size: 80%;
+div.contents, div.body, div.footer {
+  page-break-before: always;
 }
-.class {
+.class, .enumeration, .function, .struct, .typedef, .union {
   border-bottom: solid 2px gray;
 }
-.constants {
-}
 .description {
   margin-top: 0.5em;
 }
-.discussion {
-}
-.enumeration {
-  border-bottom: solid 2px gray;
-}
 .function {
-  border-bottom: solid 2px gray;
   margin-bottom: 0;
 }
-.members {
-}
-.method {
-}
-.parameters {
-}
-.returnvalue {
-}
-.struct {
-  border-bottom: solid 2px gray;
-}
-.typedef {
-  border-bottom: solid 2px gray;
-}
-.union {
-  border-bottom: solid 2px gray;
-}
-.variable {
-}
-h1, h2, h3, h4, h5, h6 {
-  page-break-inside: avoid;
-}
 blockquote {
   border: solid thin gray;
   box-shadow: 3px 3px 5px rgba(0,0,0,0.5);
@@ -97,19 +68,15 @@ blockquote {
   page-break-inside: avoid;
 }
 p code, li code, p.code, pre, ul.code li {
-  background: rgba(127,127,127,0.1);
-  border: thin dotted gray;
   font-family: monospace;
-  font-size: 90%;
   hyphens: manual;
   -webkit-hyphens: manual;
-  page-break-inside: avoid;
 }
 p.code, pre, ul.code li {
+  background: rgba(127,127,127,0.1);
+  border: thin dotted gray;
   padding: 10px;
-}
-p code, li code {
-  padding: 2px 5px;
+  page-break-inside: avoid;
 }
 a:link, a:visited {
   text-decoration: none;
@@ -123,7 +90,7 @@ span.info {
   font-weight: bold;
   white-space: nowrap;
 }
-h3 span.info, h4 span.info {
+h1 span.info, h2 span.info, h3 span.info, h4 span.info {
   border-top-left-radius: 10px;
   border-top-right-radius: 10px;
   float: right;
@@ -143,13 +110,38 @@ ul.contents > li {
 ul.contents li ul.code, ul.contents li ul.subcontents {
   padding-left: 2em;
 }
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+td {
+  border: solid 1px #666;
+  padding: 5px 10px;
+  vertical-align: top;
+}
+td.left {
+  text-align: left;
+}
+td.center {
+  text-align: center;
+}
+td.right {
+  text-align: right;
+}
+th {
+  border-bottom: solid 2px #000;
+  padding: 1px 5px;
+  text-align: center;
+  vertical-align: bottom;
+}
+tr:nth-child(even) {
+  background: rgba(127,127,127,0.1);n}
 table.list {
   border-collapse: collapse;
   width: 100%;
 }
-table.list tr:nth-child(even) {
-  background: rgba(127,127,127,0.1);]n}
 table.list th {
+  border-bottom: none;
   border-right: 2px solid gray;
   font-family: monospace;
   padding: 5px 10px 5px 2px;
@@ -157,24 +149,22 @@ table.list th {
   vertical-align: top;
 }
 table.list td {
+  border: none;
   padding: 5px 2px 5px 10px;
   text-align: left;
   vertical-align: top;
 }
-h1.title {
-}
-h2.title {
-  border-bottom: solid 2px black;
-}
-h3.title {
+h2.title, h3.title {
   border-bottom: solid 2px black;
 }
 --></style>
   </head>
   <body>
-    <h1 class="title">CUPS Programming Manual</h1>
-    <p>Michael R Sweet</p>
-    <p>Copyright &#xa9; 2007-2019 by Apple Inc. All Rights Reserved.</p>
+    <div class="header">
+      <h1 class="title">CUPS Programming Manual</h1>
+      <p>Michael R Sweet</p>
+      <p>Copyright &#xa9; 2007-2019 by Apple Inc. All Rights Reserved.</p>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
@@ -197,7 +187,6 @@ h3.title {
           <li><a href="#authentication">Authentication</a></li>
         </ul></li>
         <li><a href="#FUNCTIONS">Functions</a><ul class="subcontents">
-          <li><a href="#CF_OPTIONS">CF_OPTIONS</a></li>
           <li><a href="#cupsAddDest">cupsAddDest</a></li>
           <li><a href="#cupsAddDestMediaOptions">cupsAddDestMediaOptions</a></li>
           <li><a href="#cupsAddIntegerOption">cupsAddIntegerOption</a></li>
@@ -487,9 +476,6 @@ h3.title {
           <li><a href="#cups_option_s">cups_option_s</a></li>
           <li><a href="#cups_size_s">cups_size_s</a></li>
         </ul></li>
-        <li><a href="#VARIABLES">Variables</a><ul class="subcontents">
-          <li><a href="#kSecOidOrganizationalUnit">kSecOidOrganizationalUnit</a></li>
-        </ul></li>
         <li><a href="#ENUMERATIONS">Enumerations</a><ul class="subcontents">
           <li><a href="#cups_ptype_e">cups_ptype_e</a></li>
           <li><a href="#http_encoding_e">http_encoding_e</a></li>
@@ -520,16 +506,20 @@ h3.title {
     <blockquote>
     <p>Please <a href="https://github.com/apple/cups/issues">file issues on Github</a> to provide feedback on this document.</p>
 </blockquote>
-    <h2><a id="introduction">Introduction</a></h2>
+    <h2 class="title" id="introduction">Introduction</h2>
     <p>CUPS provides the &quot;cups&quot; library to talk to the different parts of CUPS and with Internet Printing Protocol (IPP) printers. The &quot;cups&quot; library functions are accessed by including the <code>&lt;cups/cups.h&gt;</code> header.</p>
     <p>CUPS is based on the Internet Printing Protocol (&quot;IPP&quot;), which allows clients (applications) to communicate with a server (the scheduler, printers, etc.) to get a list of destinations, send print jobs, and so forth. You identify which server you want to communicate with using a pointer to the opaque structure <code>http_t</code>. The <code>CUPS_HTTP_DEFAULT</code> constant can be used when you want to talk to the CUPS scheduler.</p>
-    <h3><a id="guidelines">Guidelines</a></h3>
+    <h3 class="title" id="guidelines">Guidelines</h3>
     <p>When writing software (other than printer drivers) that uses the &quot;cups&quot; library:</p>
     <ul>
-    <li>Do not use undocumented or deprecated APIs,</li>
-    <li>Do not rely on pre-configured printers,</li>
-    <li>Do not assume that printers support specific features or formats, and</li>
-    <li>Do not rely on implementation details (PPDs, etc.)</li>
+    <li>    <p>Do not use undocumented or deprecated APIs,</p>
+</li>
+    <li>    <p>Do not rely on pre-configured printers,</p>
+</li>
+    <li>    <p>Do not assume that printers support specific features or formats, and</p>
+</li>
+    <li>    <p>Do not rely on implementation details (PPDs, etc.)</p>
+</li>
 </ul>
     <p>CUPS is designed to insulate users and developers from the implementation details of printers and file formats. The goal is to allow an application to supply a print file in a standard format with the user intent (&quot;print four copies, two-sided on A4 media, and staple each copy&quot;) and have the printing system manage the printer communication and format conversion needed.</p>
     <p>Similarly, printer and job management applications can use standard query operations to obtain the status information in a common, generic form and use standard management operations to control the state of those printers and jobs.</p>
@@ -537,9 +527,9 @@ h3.title {
     <p><strong>Note:</strong></p>
     <p>CUPS printer drivers necessarily depend on specific file formats and certain implementation details of the CUPS software. Please consult the Postscript and raster printer driver developer documentation on <a href="https://www.cups.org/documentation.html">CUPS.org</a> for more information.</p>
 </blockquote>
-    <h3><a id="terms-used-in-this-document">Terms Used in This Document</a></h3>
-    <p>A <em>Destination</em> is a printer or print queue that accepts print jobs. A <em>Print</em> <em>Job</em> is a collection of one or more documents that are processed by a destination using options supplied when creating the job. A <em>Document</em> is a file (JPEG image, PDF file, etc.) suitable for printing. An <em>Option</em> controls some aspect of printing, such as the media used. <em>Media</em> is the sheets or roll that is printed on. An <em>Attribute</em> is an option encoded for an Internet Printing Protocol (IPP) request.</p>
-    <h3><a id="compiling-programs-that-use-the-cups-api">Compiling Programs That Use the CUPS API</a></h3>
+    <h3 class="title" id="terms-used-in-this-document">Terms Used in This Document</h3>
+    <p>A <em>Destination</em> is a printer or print queue that accepts print jobs. A <em>Print Job</em> is a collection of one or more documents that are processed by a destination using options supplied when creating the job. A <em>Document</em> is a file (JPEG image, PDF file, etc.) suitable for printing. An <em>Option</em> controls some aspect of printing, such as the media used. <em>Media</em> is the sheets or roll that is printed on. An <em>Attribute</em> is an option encoded for an Internet Printing Protocol (IPP) request.</p>
+    <h3 class="title" id="compiling-programs-that-use-the-cups-api">Compiling Programs That Use the CUPS API</h3>
     <p>The CUPS libraries can be used from any C, C++, or Objective C program. The method of compiling against the libraries varies depending on the operating system and installation of CUPS. The following sections show how to compile a simple program (shown below) in two common environments.</p>
     <p>The following simple program lists the available destinations:</p>
     <pre><code>#include &lt;stdio.h&gt;
@@ -562,20 +552,20 @@ int main(void)
   return (0);
 }
 </code></pre>
-    <h4><a id="compiling-with-xcode">Compiling with Xcode</a></h4>
-    <p>In Xcode, choose <em>New</em> <em>Project...</em> from the <em>File</em> menu (or press SHIFT+CMD+N), then select the <em>Command</em> <em>Line</em> <em>Tool</em> under the macOS Application project type. Click <em>Next</em> and enter a name for the project, for example &quot;firstcups&quot;. Click <em>Next</em> and choose a project directory. The click <em>Next</em> to create the project.</p>
-    <p>In the project window, click on the <em>Build</em> <em>Phases</em> group and expand the <em>Link</em> <em>Binary</em> <em>with</em> <em>Libraries</em> section. Click <em>+</em>, type &quot;libcups&quot; to show the library, and then double-click on <code>libcups.tbd</code>.</p>
+    <h4 id="compiling-with-xcode">Compiling with Xcode</h4>
+    <p>In Xcode, choose <em>New Project...</em> from the <em>File</em> menu (or press SHIFT+CMD+N), then select the <em>Command Line Tool</em> under the macOS Application project type. Click <em>Next</em> and enter a name for the project, for example &quot;firstcups&quot;. Click <em>Next</em> and choose a project directory. The click <em>Next</em> to create the project.</p>
+    <p>In the project window, click on the <em>Build Phases</em> group and expand the <em>Link Binary with Libraries</em> section. Click <em>+</em>, type &quot;libcups&quot; to show the library, and then double-click on <code>libcups.tbd</code>.</p>
     <p>Finally, click on the <code>main.c</code> file in the sidebar and copy the example program to the file. Build and run (CMD+R) to see the list of destinations.</p>
-    <h4><a id="compiling-with-gcc">Compiling with GCC</a></h4>
+    <h4 id="compiling-with-gcc">Compiling with GCC</h4>
     <p>From the command-line, create a file called <code>sample.c</code> using your favorite editor, copy the example to this file, and save. Then run the following command to compile it with GCC and run it:</p>
     <pre><code>gcc -o simple `cups-config --cflags` simple.c `cups-config --libs`
 ./simple
 </code></pre>
     <p>The <code>cups-config</code> command provides the compiler flags (<code>cups-config --cflags</code>) and libraries (<code>cups-config --libs</code>) needed for the local system.</p>
-    <h2><a id="working-with-destinations">Working with Destinations</a></h2>
+    <h2 class="title" id="working-with-destinations">Working with Destinations</h2>
     <p>Destinations, which in CUPS represent individual printers or classes (collections or pools) of printers, are represented by the <code>cups_dest_t</code> structure which includes the name (<code>name</code>), instance (<code>instance</code>, saved options/settings), whether the destination is the default for the user (<code>is_default</code>), and the options and basic information associated with that destination (<code>num_options</code> and <code>options</code>).</p>
     <p>Historically destinations have been manually maintained by the administrator of a system or network, but CUPS also supports dynamic discovery of destinations on the current network.</p>
-    <h3><a id="finding-available-destinations">Finding Available Destinations</a></h3>
+    <h3 class="title" id="finding-available-destinations">Finding Available Destinations</h3>
     <p>The <code>cupsEnumDests</code> function finds all of the available destinations:</p>
     <pre><code> int
  cupsEnumDests(unsigned flags, int msec, int *cancel,
@@ -587,24 +577,42 @@ int main(void)
     <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>
     <ul>
-    <li><code>CUPS_PRINTER_CLASS</code>: A collection of destinations.</li>
-    <li><code>CUPS_PRINTER_FAX</code>: A facsimile device.</li>
-    <li><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.</li>
-    <li><code>CUPS_PRINTER_REMOTE</code>: A remote (shared) printer or class.</li>
-    <li><code>CUPS_PRINTER_DISCOVERED</code>: An available network printer or class.</li>
-    <li><code>CUPS_PRINTER_BW</code>: Can do B&amp;W printing.</li>
-    <li><code>CUPS_PRINTER_COLOR</code>: Can do color printing.</li>
-    <li><code>CUPS_PRINTER_DUPLEX</code>: Can do two-sided printing.</li>
-    <li><code>CUPS_PRINTER_STAPLE</code>: Can staple output.</li>
-    <li><code>CUPS_PRINTER_COLLATE</code>: Can quickly collate copies.</li>
-    <li><code>CUPS_PRINTER_PUNCH</code>: Can punch output.</li>
-    <li><code>CUPS_PRINTER_COVER</code>: Can cover output.</li>
-    <li><code>CUPS_PRINTER_BIND</code>: Can bind output.</li>
-    <li><code>CUPS_PRINTER_SORT</code>: Can sort output (mailboxes, etc.)</li>
-    <li><code>CUPS_PRINTER_SMALL</code>: Can print on Letter/Legal/A4-size media.</li>
-    <li><code>CUPS_PRINTER_MEDIUM</code>: Can print on Tabloid/B/C/A3/A2-size media.</li>
-    <li><code>CUPS_PRINTER_LARGE</code>: Can print on D/E/A1/A0-size media.</li>
-    <li><code>CUPS_PRINTER_VARIABLE</code>: Can print on rolls and custom-size media.</li>
+    <li>    <p><code>CUPS_PRINTER_CLASS</code>: A collection of destinations.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_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>
+    <li>    <p><code>CUPS_PRINTER_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>
+    <li>    <p><code>CUPS_PRINTER_BW</code>: Can do B&amp;W printing.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_COLOR</code>: Can do color printing.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_DUPLEX</code>: Can do two-sided printing.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_STAPLE</code>: Can staple output.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_COLLATE</code>: Can quickly collate copies.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_PUNCH</code>: Can punch output.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_COVER</code>: Can cover output.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_BIND</code>: Can bind output.</p>
+</li>
+    <li>    <p><code>CUPS_PRINTER_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>
+    <li>    <p><code>CUPS_PRINTER_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>
+    <li>    <p><code>CUPS_PRINTER_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>
     <pre><code>typedef int (*cups_dest_cb_t)(void *user_data,
@@ -613,9 +621,12 @@ int main(void)
 </code></pre>
     <p>The callback function receives a copy of the <code>user_data</code> argument along with a bitfield (<code>flags</code>) and the destination that was found. The <code>flags</code> argument can have any of the following constant (bit) values set:</p>
     <ul>
-    <li><code>CUPS_DEST_FLAGS_MORE</code>: There are more destinations coming.</li>
-    <li><code>CUPS_DEST_FLAGS_REMOVED</code>: The destination has gone away and should be removed from the list of destinations a user can select.</li>
-    <li><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.</li>
+    <li>    <p><code>CUPS_DEST_FLAGS_MORE</code>: There are more destinations coming.</p>
+</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>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>
     <blockquote>
@@ -689,34 +700,45 @@ my_get_dests(cups_ptype_t type, cups_ptype_t mask,
   return (user_data.num_dests);
 }
 </code></pre>
-    <h3><a id="basic-destination-information">Basic Destination Information</a></h3>
+    <h3 class="title" id="basic-destination-information">Basic Destination Information</h3>
     <p>The <code>num_options</code> and <code>options</code> members of the <code>cups_dest_t</code> structure provide basic attributes about the destination in addition to the user default options and values for that destination. The following names are predefined for various destination attributes:</p>
     <ul>
-    <li>&quot;auth-info-required&quot;: The type of authentication required for printing to this destination: &quot;none&quot;, &quot;username,password&quot;, &quot;domain,username,password&quot;, or &quot;negotiate&quot; (Kerberos).</li>
-    <li>&quot;printer-info&quot;: The human-readable description of the destination such as &quot;My Laser Printer&quot;.</li>
-    <li>&quot;printer-is-accepting-jobs&quot;: &quot;true&quot; if the destination is accepting new jobs, &quot;false&quot; otherwise.</li>
-    <li>&quot;printer-is-shared&quot;: &quot;true&quot; if the destination is being shared with other computers, &quot;false&quot; otherwise.</li>
-    <li>&quot;printer-location&quot;: The human-readable location of the destination such as &quot;Lab 4&quot;.</li>
-    <li>&quot;printer-make-and-model&quot;: The human-readable make and model of the destination such as &quot;ExampleCorp LaserPrinter 4000 Series&quot;.</li>
-    <li>&quot;printer-state&quot;: &quot;3&quot; if the destination is idle, &quot;4&quot; if the destination is printing a job, and &quot;5&quot; if the destination is stopped.</li>
-    <li>&quot;printer-state-change-time&quot;: The UNIX time when the destination entered the current state.</li>
-    <li>&quot;printer-state-reasons&quot;: Additional comma-delimited state keywords for the destination such as &quot;media-tray-empty-error&quot; and &quot;toner-low-warning&quot;.</li>
-    <li>&quot;printer-type&quot;: The <code>cups_ptype_t</code> value associated with the destination.</li>
-    <li>&quot;printer-uri-supported&quot;: The URI associated with the destination; if not set, this destination was discovered but is not yet setup as a local printer.</li>
+    <li>    <p>&quot;auth-info-required&quot;: The type of authentication required for printing to this destination: &quot;none&quot;, &quot;username,password&quot;, &quot;domain,username,password&quot;, or &quot;negotiate&quot; (Kerberos).</p>
+</li>
+    <li>    <p>&quot;printer-info&quot;: The human-readable description of the destination such as &quot;My Laser Printer&quot;.</p>
+</li>
+    <li>    <p>&quot;printer-is-accepting-jobs&quot;: &quot;true&quot; if the destination is accepting new jobs, &quot;false&quot; otherwise.</p>
+</li>
+    <li>    <p>&quot;printer-is-shared&quot;: &quot;true&quot; if the destination is being shared with other computers, &quot;false&quot; otherwise.</p>
+</li>
+    <li>    <p>&quot;printer-location&quot;: The human-readable location of the destination such as &quot;Lab 4&quot;.</p>
+</li>
+    <li>    <p>&quot;printer-make-and-model&quot;: The human-readable make and model of the destination such as &quot;ExampleCorp LaserPrinter 4000 Series&quot;.</p>
+</li>
+    <li>    <p>&quot;printer-state&quot;: &quot;3&quot; if the destination is idle, &quot;4&quot; if the destination is printing a job, and &quot;5&quot; if the destination is stopped.</p>
+</li>
+    <li>    <p>&quot;printer-state-change-time&quot;: The UNIX time when the destination entered the current state.</p>
+</li>
+    <li>    <p>&quot;printer-state-reasons&quot;: Additional comma-delimited state keywords for the destination such as &quot;media-tray-empty-error&quot; and &quot;toner-low-warning&quot;.</p>
+</li>
+    <li>    <p>&quot;printer-type&quot;: The <code>cups_ptype_t</code> value associated with the destination.</p>
+</li>
+    <li>    <p>&quot;printer-uri-supported&quot;: The URI associated with the destination; if not set, this destination was discovered but is not yet setup as a local printer.</p>
+</li>
 </ul>
     <p>Use the <code>cupsGetOption</code> function to retrieve the value. For example, the following code gets the make and model of a destination:</p>
     <pre><code>const char *model = cupsGetOption(&quot;printer-make-and-model&quot;,
                                   dest-&gt;num_options,
                                   dest-&gt;options);
 </code></pre>
-    <h3><a id="detailed-destination-information">Detailed Destination Information</a></h3>
+    <h3 class="title" id="detailed-destination-information">Detailed Destination Information</h3>
     <p>Once a destination has been chosen, the <code>cupsCopyDestInfo</code> function can be used to gather detailed information about the destination:</p>
     <pre><code>cups_dinfo_t *
 cupsCopyDestInfo(http_t *http, cups_dest_t *dest);
 </code></pre>
     <p>The <code>http</code> argument specifies a connection to the CUPS scheduler and is typically the constant <code>CUPS_HTTP_DEFAULT</code>. The <code>dest</code> argument specifies the destination to query.</p>
     <p>The <code>cups_dinfo_t</code> structure that is returned contains a snapshot of the supported options and their supported, ready, and default values. It also can report constraints between different options and values, and recommend changes to resolve those constraints.</p>
-    <h4><a id="getting-supported-options-and-values">Getting Supported Options and Values</a></h4>
+    <h4 id="getting-supported-options-and-values">Getting Supported Options and Values</h4>
     <p>The <code>cupsCheckDestSupported</code> function can be used to test whether a particular option or option and value is supported:</p>
     <pre><code>int
 cupsCheckDestSupported(http_t *http, cups_dest_t *dest,
@@ -726,16 +748,26 @@ cupsCheckDestSupported(http_t *http, cups_dest_t *dest,
 </code></pre>
     <p>The <code>option</code> argument specifies the name of the option to check. The following constants can be used to check the various standard options:</p>
     <ul>
-    <li><code>CUPS_COPIES</code>: Controls the number of copies that are produced.</li>
-    <li><code>CUPS_FINISHINGS</code>: A comma-delimited list of integer constants that control the finishing processes that are applied to the job, including stapling, punching, and folding.</li>
-    <li><code>CUPS_MEDIA</code>: Controls the media size that is used, typically one of the following: <code>CUPS_MEDIA_3X5</code>, <code>CUPS_MEDIA_4X6</code>, <code>CUPS_MEDIA_5X7</code>, <code>CUPS_MEDIA_8X10</code>, <code>CUPS_MEDIA_A3</code>, <code>CUPS_MEDIA_A4</code>, <code>CUPS_MEDIA_A5</code>, <code>CUPS_MEDIA_A6</code>, <code>CUPS_MEDIA_ENV10</code>, <code>CUPS_MEDIA_ENVDL</code>, <code>CUPS_MEDIA_LEGAL</code>, <code>CUPS_MEDIA_LETTER</code>, <code>CUPS_MEDIA_PHOTO_L</code>, <code>CUPS_MEDIA_SUPERBA3</code>, or <code>CUPS_MEDIA_TABLOID</code>.</li>
-    <li><code>CUPS_MEDIA_SOURCE</code>: Controls where the media is pulled from, typically either <code>CUPS_MEDIA_SOURCE_AUTO</code> or <code>CUPS_MEDIA_SOURCE_MANUAL</code>.</li>
-    <li><code>CUPS_MEDIA_TYPE</code>: Controls the type of media that is used, typically one of the following: <code>CUPS_MEDIA_TYPE_AUTO</code>, <code>CUPS_MEDIA_TYPE_ENVELOPE</code>, <code>CUPS_MEDIA_TYPE_LABELS</code>, <code>CUPS_MEDIA_TYPE_LETTERHEAD</code>, <code>CUPS_MEDIA_TYPE_PHOTO</code>, <code>CUPS_MEDIA_TYPE_PHOTO_GLOSSY</code>, <code>CUPS_MEDIA_TYPE_PHOTO_MATTE</code>, <code>CUPS_MEDIA_TYPE_PLAIN</code>, or <code>CUPS_MEDIA_TYPE_TRANSPARENCY</code>.</li>
-    <li><code>CUPS_NUMBER_UP</code>: Controls the number of document pages that are placed on each media side.</li>
-    <li><code>CUPS_ORIENTATION</code>: Controls the orientation of document pages placed on the media: <code>CUPS_ORIENTATION_PORTRAIT</code> or <code>CUPS_ORIENTATION_LANDSCAPE</code>.</li>
-    <li><code>CUPS_PRINT_COLOR_MODE</code>: Controls whether the output is in color (<code>CUPS_PRINT_COLOR_MODE_COLOR</code>), grayscale (<code>CUPS_PRINT_COLOR_MODE_MONOCHROME</code>), or either (<code>CUPS_PRINT_COLOR_MODE_AUTO</code>).</li>
-    <li><code>CUPS_PRINT_QUALITY</code>: Controls the generate quality of the output: <code>CUPS_PRINT_QUALITY_DRAFT</code>, <code>CUPS_PRINT_QUALITY_NORMAL</code>, or <code>CUPS_PRINT_QUALITY_HIGH</code>.</li>
-    <li><code>CUPS_SIDES</code>: Controls whether prints are placed on one or both sides of the media: <code>CUPS_SIDES_ONE_SIDED</code>, <code>CUPS_SIDES_TWO_SIDED_PORTRAIT</code>, or <code>CUPS_SIDES_TWO_SIDED_LANDSCAPE</code>.</li>
+    <li>    <p><code>CUPS_COPIES</code>: Controls the number of copies that are produced.</p>
+</li>
+    <li>    <p><code>CUPS_FINISHINGS</code>: A comma-delimited list of integer constants that control the finishing processes that are applied to the job, including stapling, punching, and folding.</p>
+</li>
+    <li>    <p><code>CUPS_MEDIA</code>: Controls the media size that is used, typically one of the following: <code>CUPS_MEDIA_3X5</code>, <code>CUPS_MEDIA_4X6</code>, <code>CUPS_MEDIA_5X7</code>, <code>CUPS_MEDIA_8X10</code>, <code>CUPS_MEDIA_A3</code>, <code>CUPS_MEDIA_A4</code>, <code>CUPS_MEDIA_A5</code>, <code>CUPS_MEDIA_A6</code>, <code>CUPS_MEDIA_ENV10</code>, <code>CUPS_MEDIA_ENVDL</code>, <code>CUPS_MEDIA_LEGAL</code>, <code>CUPS_MEDIA_LETTER</code>, <code>CUPS_MEDIA_PHOTO_L</code>, <code>CUPS_MEDIA_SUPERBA3</code>, or <code>CUPS_MEDIA_TABLOID</code>.</p>
+</li>
+    <li>    <p><code>CUPS_MEDIA_SOURCE</code>: Controls where the media is pulled from, typically either <code>CUPS_MEDIA_SOURCE_AUTO</code> or <code>CUPS_MEDIA_SOURCE_MANUAL</code>.</p>
+</li>
+    <li>    <p><code>CUPS_MEDIA_TYPE</code>: Controls the type of media that is used, typically one of the following: <code>CUPS_MEDIA_TYPE_AUTO</code>, <code>CUPS_MEDIA_TYPE_ENVELOPE</code>, <code>CUPS_MEDIA_TYPE_LABELS</code>, <code>CUPS_MEDIA_TYPE_LETTERHEAD</code>, <code>CUPS_MEDIA_TYPE_PHOTO</code>, <code>CUPS_MEDIA_TYPE_PHOTO_GLOSSY</code>, <code>CUPS_MEDIA_TYPE_PHOTO_MATTE</code>, <code>CUPS_MEDIA_TYPE_PLAIN</code>, or <code>CUPS_MEDIA_TYPE_TRANSPARENCY</code>.</p>
+</li>
+    <li>    <p><code>CUPS_NUMBER_UP</code>: Controls the number of document pages that are placed on each media side.</p>
+</li>
+    <li>    <p><code>CUPS_ORIENTATION</code>: Controls the orientation of document pages placed on the media: <code>CUPS_ORIENTATION_PORTRAIT</code> or <code>CUPS_ORIENTATION_LANDSCAPE</code>.</p>
+</li>
+    <li>    <p><code>CUPS_PRINT_COLOR_MODE</code>: Controls whether the output is in color (<code>CUPS_PRINT_COLOR_MODE_COLOR</code>), grayscale (<code>CUPS_PRINT_COLOR_MODE_MONOCHROME</code>), or either (<code>CUPS_PRINT_COLOR_MODE_AUTO</code>).</p>
+</li>
+    <li>    <p><code>CUPS_PRINT_QUALITY</code>: Controls the generate quality of the output: <code>CUPS_PRINT_QUALITY_DRAFT</code>, <code>CUPS_PRINT_QUALITY_NORMAL</code>, or <code>CUPS_PRINT_QUALITY_HIGH</code>.</p>
+</li>
+    <li>    <p><code>CUPS_SIDES</code>: Controls whether prints are placed on one or both sides of the media: <code>CUPS_SIDES_ONE_SIDED</code>, <code>CUPS_SIDES_TWO_SIDED_PORTRAIT</code>, or <code>CUPS_SIDES_TWO_SIDED_LANDSCAPE</code>.</p>
+</li>
 </ul>
     <p>If the <code>value</code> argument is <code>NULL</code>, the <code>cupsCheckDestSupported</code> function returns whether the option is supported by the destination. Otherwise, the function returns whether the specified value of the option is supported.</p>
     <p>The <code>cupsFindDestSupported</code> function returns the IPP attribute containing the supported values for a given option:</p>
@@ -772,7 +804,7 @@ int i, count = ippGetCount(attrs);
 for (i = 0; i &lt; count; i ++)
   puts(ippGetString(attrs, i, NULL));
 </code></pre>
-    <h4><a id="getting-default-values">Getting Default Values</a></h4>
+    <h4 id="getting-default-values">Getting Default Values</h4>
     <p>There are two sets of default values - user defaults that are available via the <code>num_options</code> and <code>options</code> members of the <code>cups_dest_t</code> structure, and destination defaults that available via the <code>cups_dinfo_t</code> structure and the <code>cupsFindDestDefault</code> function which returns the IPP attribute containing the default value(s) for a given option:</p>
     <pre><code>ipp_attribute_t *
 cupsFindDestDefault(http_t *http, cups_dest_t *dest,
@@ -802,7 +834,7 @@ else
   putchar('\n');
 }
 </code></pre>
-    <h4><a id="getting-ready-loaded-values">Getting Ready (Loaded) Values</a></h4>
+    <h4 id="getting-ready-loaded-values">Getting Ready (Loaded) Values</h4>
     <p>The finishings and media options also support queries for the ready, or loaded, values. For example, a printer may have punch and staple finishers installed but be out of staples - the supported values will list both punch and staple finishing processes but the ready values will only list the punch processes. Similarly, a printer may support hundreds of different sizes of media but only have a single size loaded at any given time - the ready values are limited to the media that is actually in the printer.</p>
     <p>The <code>cupsFindDestReady</code> function finds the IPP attribute containing the ready values for a given option:</p>
     <pre><code>ipp_attribute_t *
@@ -825,7 +857,7 @@ if (ready_finishings != NULL)
 else
   puts(&quot;no finishings are ready.&quot;);
 </code></pre>
-    <h4><a id="media-size-options">Media Size Options</a></h4>
+    <h4 id="media-size-options">Media Size Options</h4>
     <p>CUPS provides functions for querying the dimensions and margins for each of the supported media size options. The <code>cups_size_t</code> structure is used to describe a media size:</p>
     <pre><code>typedef struct cups_size_s
 {
@@ -850,11 +882,16 @@ cupsGetDestMediaBySize(http_t *http, cups_dest_t *dest,
 </code></pre>
     <p>The <code>media</code>, <code>width</code>, and <code>length</code> arguments specify the size to lookup. The <code>flags</code> argument specifies a bitfield controlling various lookup options:</p>
     <ul>
-    <li><code>CUPS_MEDIA_FLAGS_DEFAULT</code>: Find the closest size supported by the printer.</li>
-    <li><code>CUPS_MEDIA_FLAGS_BORDERLESS</code>: Find a borderless size.</li>
-    <li><code>CUPS_MEDIA_FLAGS_DUPLEX</code>: Find a size compatible with two-sided printing.</li>
-    <li><code>CUPS_MEDIA_FLAGS_EXACT</code>: Find an exact match for the size.</li>
-    <li><code>CUPS_MEDIA_FLAGS_READY</code>: If the printer supports media sensing or configuration of the media in each tray/source, find the size amongst the &quot;ready&quot; media.</li>
+    <li>    <p><code>CUPS_MEDIA_FLAGS_DEFAULT</code>: Find the closest size supported by the printer.</p>
+</li>
+    <li>    <p><code>CUPS_MEDIA_FLAGS_BORDERLESS</code>: Find a borderless size.</p>
+</li>
+    <li>    <p><code>CUPS_MEDIA_FLAGS_DUPLEX</code>: Find a size compatible with two-sided printing.</p>
+</li>
+    <li>    <p><code>CUPS_MEDIA_FLAGS_EXACT</code>: Find an exact match for the size.</p>
+</li>
+    <li>    <p><code>CUPS_MEDIA_FLAGS_READY</code>: If the printer supports media sensing or configuration of the media in each tray/source, find the size amongst the &quot;ready&quot; media.</p>
+</li>
 </ul>
     <p>If a matching size is found for the destination, the size information is stored in the structure pointed to by the <code>size</code> argument and 1 is returned. Otherwise 0 is returned.</p>
     <p>For example, the following code prints the margins for two-sided printing on US Letter media:</p>
@@ -912,7 +949,7 @@ cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest,
                         cups_dinfo_t *dinfo, unsigned flags,
                         cups_size_t *size);
 </code></pre>
-    <h4><a id="localizing-options-and-values">Localizing Options and Values</a></h4>
+    <h4 id="localizing-options-and-values">Localizing Options and Values</h4>
     <p>CUPS provides three functions to get localized, human-readable strings in the user's current locale for options and values: <code>cupsLocalizeDestMedia</code>, <code>cupsLocalizeDestOption</code>, and <code>cupsLocalizeDestValue</code>:</p>
     <pre><code>const char *
 cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest,
@@ -929,7 +966,7 @@ cupsLocalizeDestValue(http_t *http, cups_dest_t *dest,
                       cups_dinfo_t *info,
                       const char *option, const char *value);
 </code></pre>
-    <h3><a id="submitting-a-print-job">Submitting a Print Job</a></h3>
+    <h3 class="title" id="submitting-a-print-job">Submitting a Print Job</h3>
     <p>Once you are ready to submit a print job, you create a job using the <code>cupsCreateDestJob</code> function:</p>
     <pre><code>ipp_status_t
 cupsCreateDestJob(http_t *http, cups_dest_t *dest,
@@ -980,10 +1017,14 @@ cupsFinishDestDocument(http_t *http, cups_dest_t *dest,
 </code></pre>
     <p>The <code>docname</code> argument specifies the name of the document, typically the original filename. The <code>format</code> argument specifies the MIME media type of the document, including the following constants:</p>
     <ul>
-    <li><code>CUPS_FORMAT_JPEG</code>: &quot;image/jpeg&quot;</li>
-    <li><code>CUPS_FORMAT_PDF</code>: &quot;application/pdf&quot;</li>
-    <li><code>CUPS_FORMAT_POSTSCRIPT</code>: &quot;application/postscript&quot;</li>
-    <li><code>CUPS_FORMAT_TEXT</code>: &quot;text/plain&quot;</li>
+    <li>    <p><code>CUPS_FORMAT_JPEG</code>: &quot;image/jpeg&quot;</p>
+</li>
+    <li>    <p><code>CUPS_FORMAT_PDF</code>: &quot;application/pdf&quot;</p>
+</li>
+    <li>    <p><code>CUPS_FORMAT_POSTSCRIPT</code>: &quot;application/postscript&quot;</p>
+</li>
+    <li>    <p><code>CUPS_FORMAT_TEXT</code>: &quot;text/plain&quot;</p>
+</li>
 </ul>
     <p>The <code>num_options</code> and <code>options</code> arguments specify per-document print options, which at present must be 0 and <code>NULL</code>. The <code>last_document</code> argument specifies whether this is the last document in the job.</p>
     <p>For example, the following code submits a PDF file to the job that was just created:</p>
@@ -1010,9 +1051,9 @@ if (cupsStartDestDocument(CUPS_HTTP_DEFAULT, dest, info,
 
 fclose(fp);
 </code></pre>
-    <h2><a id="sending-ipp-requests">Sending IPP Requests</a></h2>
+    <h2 class="title" id="sending-ipp-requests">Sending IPP Requests</h2>
     <p>CUPS provides a rich API for sending IPP requests to the scheduler or printers, typically from management or utility applications whose primary purpose is not to send print jobs.</p>
-    <h3><a id="connecting-to-the-scheduler-or-printer">Connecting to the Scheduler or Printer</a></h3>
+    <h3 class="title" id="connecting-to-the-scheduler-or-printer">Connecting to the Scheduler or Printer</h3>
     <p>The connection to the scheduler or printer is represented by the HTTP connection type <code>http_t</code>. The <code>cupsConnectDest</code> function connects to the scheduler or printer associated with the destination:</p>
     <pre><code>http_t *
 cupsConnectDest(cups_dest_t *dest, unsigned flags, int msec,
@@ -1033,7 +1074,7 @@ http_t *http = cupsConnectDest(dest, CUPS_DEST_FLAGS_DEVICE,
                                30000, NULL, resource,
                                sizeof(resource), NULL, NULL);
 </code></pre>
-    <h3><a id="creating-an-ipp-request">Creating an IPP Request</a></h3>
+    <h3 class="title" id="creating-an-ipp-request">Creating an IPP Request</h3>
     <p>IPP requests are represented by the IPP message type <code>ipp_t</code> and each IPP attribute in the request is representing using the type <code>ipp_attribute_t</code>. Each IPP request includes an operation code (<code>IPP_OP_CREATE_JOB</code>, <code>IPP_OP_GET_PRINTER_ATTRIBUTES</code>, etc.) and a 32-bit integer identifier.</p>
     <p>The <code>ippNewRequest</code> function creates a new IPP request:</p>
     <pre><code>ipp_t *
@@ -1071,19 +1112,30 @@ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
     <p>The <code>ippAddStrings</code> function adds an attribute with one or more strings, in this case three. The <code>IPP_TAG_KEYWORD</code> argument specifies that the strings are keyword values, which are used for attribute names. All strings use the same language (<code>NULL</code>), and the attribute will contain the three strings in the array <code>requested_attributes</code>.</p>
     <p>CUPS provides many functions to adding attributes of different types:</p>
     <ul>
-    <li><code>ippAddBoolean</code> adds a boolean (<code>IPP_TAG_BOOLEAN</code>) attribute with one value.</li>
-    <li><code>ippAddInteger</code> adds an enum (<code>IPP_TAG_ENUM</code>) or integer (<code>IPP_TAG_INTEGER</code>) attribute with one value.</li>
-    <li><code>ippAddIntegers</code> adds an enum or integer attribute with one or more values.</li>
-    <li><code>ippAddOctetString</code> adds an octetString attribute with one value.</li>
-    <li><code>ippAddOutOfBand</code> adds a admin-defined (<code>IPP_TAG_ADMINDEFINE</code>), default (<code>IPP_TAG_DEFAULT</code>), delete-attribute (<code>IPP_TAG_DELETEATTR</code>), no-value (<code>IPP_TAG_NOVALUE</code>), not-settable (<code>IPP_TAG_NOTSETTABLE</code>), unknown (<code>IPP_TAG_UNKNOWN</code>), or unsupported (<code>IPP_TAG_UNSUPPORTED_VALUE</code>) out-of-band attribute.</li>
-    <li><code>ippAddRange</code> adds a rangeOfInteger attribute with one range.</li>
-    <li><code>ippAddRanges</code> adds a rangeOfInteger attribute with one or more ranges.</li>
-    <li><code>ippAddResolution</code> adds a resolution attribute with one resolution.</li>
-    <li><code>ippAddResolutions</code> adds a resolution attribute with one or more resolutions.</li>
-    <li><code>ippAddString</code> adds a charset (<code>IPP_TAG_CHARSET</code>), keyword (<code>IPP_TAG_KEYWORD</code>), mimeMediaType (<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code> and <code>IPP_TAG_NAMELANG</code>), naturalLanguage (<code>IPP_TAG_NATURAL_LANGUAGE</code>), text (<code>IPP_TAG_TEXT</code> and <code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), or uriScheme (<code>IPP_TAG_URISCHEME</code>) attribute with one value.</li>
-    <li><code>ippAddStrings</code> adds a charset, keyword, mimeMediaType, name, naturalLanguage, text, uri, or uriScheme attribute with one or more values.</li>
+    <li>    <p><code>ippAddBoolean</code> adds a boolean (<code>IPP_TAG_BOOLEAN</code>) attribute with one value.</p>
+</li>
+    <li>    <p><code>ippAddInteger</code> adds an enum (<code>IPP_TAG_ENUM</code>) or integer (<code>IPP_TAG_INTEGER</code>) attribute with one value.</p>
+</li>
+    <li>    <p><code>ippAddIntegers</code> adds an enum or integer attribute with one or more values.</p>
+</li>
+    <li>    <p><code>ippAddOctetString</code> adds an octetString attribute with one value.</p>
+</li>
+    <li>    <p><code>ippAddOutOfBand</code> adds a admin-defined (<code>IPP_TAG_ADMINDEFINE</code>), default (<code>IPP_TAG_DEFAULT</code>), delete-attribute (<code>IPP_TAG_DELETEATTR</code>), no-value (<code>IPP_TAG_NOVALUE</code>), not-settable (<code>IPP_TAG_NOTSETTABLE</code>), unknown (<code>IPP_TAG_UNKNOWN</code>), or unsupported (<code>IPP_TAG_UNSUPPORTED_VALUE</code>) out-of-band attribute.</p>
+</li>
+    <li>    <p><code>ippAddRange</code> adds a rangeOfInteger attribute with one range.</p>
+</li>
+    <li>    <p><code>ippAddRanges</code> adds a rangeOfInteger attribute with one or more ranges.</p>
+</li>
+    <li>    <p><code>ippAddResolution</code> adds a resolution attribute with one resolution.</p>
+</li>
+    <li>    <p><code>ippAddResolutions</code> adds a resolution attribute with one or more resolutions.</p>
+</li>
+    <li>    <p><code>ippAddString</code> adds a charset (<code>IPP_TAG_CHARSET</code>), keyword (<code>IPP_TAG_KEYWORD</code>), mimeMediaType (<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code> and <code>IPP_TAG_NAMELANG</code>), naturalLanguage (<code>IPP_TAG_NATURAL_LANGUAGE</code>), text (<code>IPP_TAG_TEXT</code> and <code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), or uriScheme (<code>IPP_TAG_URISCHEME</code>) attribute with one value.</p>
+</li>
+    <li>    <p><code>ippAddStrings</code> adds a charset, keyword, mimeMediaType, name, naturalLanguage, text, uri, or uriScheme attribute with one or more values.</p>
+</li>
 </ul>
-    <h3><a id="sending-the-ipp-request">Sending the IPP Request</a></h3>
+    <h3 class="title" id="sending-the-ipp-request">Sending the IPP Request</h3>
     <p>Once you have created the IPP request, you can send it using the <code>cupsDoRequest</code> function. For example, the following code sends the IPP Get-Printer-Attributes request to the destination and saves the response:</p>
     <pre><code>ipp_t *response = cupsDoRequest(http, request, resource);
 </code></pre>
@@ -1105,7 +1157,7 @@ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
   printf(&quot;Request failed: %s\n&quot;, cupsLastErrorString());
 }
 </code></pre>
-    <h3><a id="processing-the-ipp-response">Processing the IPP Response</a></h3>
+    <h3 class="title" id="processing-the-ipp-response">Processing the IPP Response</h3>
     <p>Each response to an IPP request is also an IPP message (<code>ipp_t</code>) with its own IPP attributes (<code>ipp_attribute_t</code>) that includes a status code (<code>IPP_STATUS_OK</code>, <code>IPP_STATUS_ERROR_BAD_REQUEST</code>, etc.) and the corresponding 32-bit integer identifier from the request.</p>
     <p>For example, the following code finds the printer state attributes and prints their values:</p>
     <pre><code>ipp_attribute_t *attr;
@@ -1142,7 +1194,7 @@ if ((attr = ippFindAttribute(response, &quot;printer-state-reasons&quot;,
     <p>Once you are done using the IPP response message, free it using the <code>ippDelete</code> function:</p>
     <pre><code>ippDelete(response);
 </code></pre>
-    <h3><a id="authentication">Authentication</a></h3>
+    <h3 class="title" id="authentication">Authentication</h3>
     <p>CUPS normally handles authentication through the console. GUI applications should set a password callback using the <code>cupsSetPasswordCB2</code> function:</p>
     <pre><code>void
 cupsSetPasswordCB2(cups_password_cb2_t cb, void *user_data);
@@ -1159,19 +1211,6 @@ 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="CF_OPTIONS">CF_OPTIONS</a></h3>
-        <p class="description"></p>
-<p class="code">
-typedef CF_OPTIONS(uint32_t, SecKeyUsage);</p>
-<h4 class="parameters">Parameters</h4>
-<table class="list"><tbody>
-<tr><th>uint32_t</th>
-</tr>
-<tr><th>SecKeyUsage</th>
-</tr>
-</tbody></table>
-<h4 class="returnvalue">Return Value</h4>
-        <p class="description"></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">
@@ -1200,7 +1239,7 @@ a copy of that destination's options.<br>
 <br>
 Use the <a href="#cupsSaveDests"><code>cupsSaveDests</code></a> function to save the updated list of
 destinations to the user's lpoptions file.</p>
-<h3 class="function"><span class="info">&#160;CUPS 2.3&#160;</span><a id="cupsAddDestMediaOptions">cupsAddDestMediaOptions</a></h3>
+<h3 class="function"><span class="info">&#160;CUPS 2.3/macOS 10.14&#160;</span><a id="cupsAddDestMediaOptions">cupsAddDestMediaOptions</a></h3>
         <p class="description">Add the option corresponding to the specified media size.</p>
 <p class="code">
 int cupsAddDestMediaOptions(<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, int num_options, <a href="#cups_option_t">cups_option_t</a> **options);</p>
@@ -1511,7 +1550,7 @@ int cupsDoAuthentication(<a href="#http_t">http_t</a> *http, const char *method,
 status, prior to resubmitting your request.
 
 </p>
-<h3 class="function"><span class="info">&#160;CUPS 2.3&#160;</span><a id="cupsEncodeOption">cupsEncodeOption</a></h3>
+<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>
@@ -6071,10 +6110,6 @@ typedef struct _ipp_s ipp_t;
         <td class="description">Top margin in hundredths of
 millimeters</td></tr>
 </tbody></table>
-      <h2 class="title"><a id="VARIABLES">Variables</a></h2>
-      <h3 class="variable"><a id="kSecOidOrganizationalUnit">kSecOidOrganizationalUnit</a></h3>
-        <p class="description">Constants, very secure stuff...</p>
-      <p class="code">extern const void *kSecOidOrganizationalUnit;</p>
       <h2 class="title"><a id="ENUMERATIONS">Constants</a></h2>
       <h3 class="enumeration"><a id="cups_ptype_e">cups_ptype_e</a></h3>
         <p class="description">Printer type/capability bit
index 9c98b27..8086c6e 100644 (file)
@@ -187,5 +187,21 @@ See the License for the specific language governing permissions and
 limitations under the License.
 </pre>
 
+<h2>CUPS Exceptions to the Apache 2.0 License</h2>
+
+<p>As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into an Object form of such source code, you
+may redistribute such embedded portions in such Object form without complying
+with the conditions of Sections 4(a), 4(b) and 4(d) of the License.</p>
+
+<p>In addition, if you combine or link compiled forms of this Software with
+software that is licensed under the GPLv2 ("Combined Software") and if a
+court of competent jurisdiction determines that the patent provision (Section
+3), the indemnity provision (Section 9) or other Section of the License
+conflicts with the conditions of the GPLv2, you may retroactively and
+prospectively choose to deem waived or otherwise exclude such Section(s) of
+the License, but only in their entirety and only with respect to the Combined
+Software.</p>
+
 </BODY>
 </HTML>
index 341b1fd..e0f6727 100644 (file)
@@ -143,7 +143,7 @@ The following directives are understood within a <i>test</i>:
 <dd style="margin-left: 5.0em"><dt><b>ATTR </b><i>tag attribute-name value(s)</i>
 <dd style="margin-left: 5.0em">Adds an attribute to the test request.
 Out-of-band tags (admin-define, delete-attribute, no-value, not-settable, unknown, unsupported) have no value.
-Values for other tags are separated by the comma (",") character - escape commas using the "" character.
+Values for other tags are delimited by the comma (",") character - escape commas using the "\" character.
 Common attributes and values are listed in the IANA IPP registry - see references below.
 <dt><b>ATTR collection </b><i>attribute-name </i><b>{ MEMBER </b><i>tag member-name value(s) ... </i><b>}</b> [ <i>... </i><b>,{ </b><i>... </i><b>} </b>]
 <dd style="margin-left: 5.0em">Adds a collection attribute to the test request.
@@ -230,7 +230,7 @@ The following predicates are understood following the <b>EXPECT</b> test directi
 <dd style="margin-left: 5.0em">Makes the <b>EXPECT</b> conditions apply only if the specified variable is not defined.
 <dt><b>IN-GROUP </b><i>tag</i>
 <dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to be in the specified group tag.
-<dt><b>OF-TYPE </b><i>tag[,tag,...]</i>
+<dt><b>OF-TYPE </b><i>tag[|tag,...]</i>
 <dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to use one of the specified value tag(s).
 <dt><b>REPEAT-LIMIT </b><i>number</i>
 <dd style="margin-left: 5.0em"><br>
index f94fa72..59832eb 100644 (file)
@@ -5,7 +5,7 @@
     <title>Developing PostScript Printer Drivers</title>
     <meta name="keywords" content="Programming">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Unknown">
     <meta name="copyright" content="Unknown">
     <meta name="version" content="0.0">
@@ -450,6 +450,7 @@ h3.title {
 --></style>
   </head>
   <body>
+    <div class="header">
 <!--
   PostScript printer driver documentation for CUPS.
 
@@ -477,6 +478,7 @@ h3.title {
 </tr>
 </tbody>
 </table></div>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
index b33ca2d..f85ebc2 100644 (file)
@@ -5,7 +5,7 @@
     <title>Introduction to the PPD Compiler</title>
     <meta name="keywords" content="Programming">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Unknown">
     <meta name="copyright" content="Unknown">
     <meta name="version" content="0.0">
@@ -450,6 +450,7 @@ h3.title {
 --></style>
   </head>
   <body>
+    <div class="header">
 <!--
   PPD compiler documentation for CUPS.
 
@@ -485,6 +486,7 @@ that describe the features and capabilities of one or more printers.</P>
 </tr>
 </tbody>
 </table></div>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
index de573c6..9b7c84e 100644 (file)
@@ -5,7 +5,7 @@
     <title>Developing Raster Printer Drivers</title>
     <meta name="keywords" content="Programming">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Unknown">
     <meta name="copyright" content="Unknown">
     <meta name="version" content="0.0">
@@ -450,6 +450,7 @@ h3.title {
 --></style>
   </head>
   <body>
+    <div class="header">
 <!--
   Raster printer driver documentation for CUPS.
 
@@ -477,6 +478,7 @@ h3.title {
 </tr>
 </tbody>
 </table></div>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
index 3782eb7..e0ed286 100644 (file)
@@ -5,7 +5,7 @@
     <title>CUPS PPD Extensions</title>
     <meta name="keywords" content="Specifications">
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-    <meta name="creator" content="codedoc v3.1">
+    <meta name="creator" content="codedoc v3.2">
     <meta name="author" content="Unknown">
     <meta name="copyright" content="Unknown">
     <meta name="version" content="0.0">
@@ -450,6 +450,7 @@ h3.title {
 --></style>
   </head>
   <body>
+    <div class="header">
 <!--
   PPD extension documentation for CUPS.
 
@@ -477,6 +478,7 @@ h3.title {
 </tr>
 </tbody>
 </table></div>
+    </div>
     <div class="contents">
       <h2 class="title">Contents</h2>
       <ul class="contents">
index 2aa98ab..fd2ddd0 100644 (file)
@@ -23,9 +23,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: CUPS 2.3b8\n"
+"Project-Id-Version: CUPS 2.3.0\n"
 "Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n"
-"POT-Creation-Date: 2019-05-17 10:17-0400\n"
+"POT-Creation-Date: 2019-08-23 09:13-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1267,7 +1267,7 @@ msgstr ""
 msgid "%s accepting requests since %s"
 msgstr ""
 
-#: scheduler/ipp.c:10336
+#: scheduler/ipp.c:10327
 #, c-format
 msgid "%s cannot be changed."
 msgstr ""
@@ -1293,7 +1293,7 @@ msgid "%s is ready and printing"
 msgstr ""
 
 #: filter/rastertoepson.c:999 filter/rastertohp.c:668
-#: filter/rastertolabel.c:1112
+#: filter/rastertolabel.c:1120
 #, c-format
 msgid "%s job-id user title copies options [file]"
 msgstr ""
@@ -1327,7 +1327,7 @@ msgstr ""
 #: cups/langprintf.c:70 scheduler/cupsfilter.c:720 systemv/lpadmin.c:795
 #: systemv/lpadmin.c:844 systemv/lpadmin.c:892 systemv/lpadmin.c:945
 #: systemv/lpadmin.c:1043 systemv/lpadmin.c:1095 systemv/lpadmin.c:1136
-#: systemv/lpadmin.c:1150 systemv/lpadmin.c:1594
+#: systemv/lpadmin.c:1150 systemv/lpadmin.c:1599
 #, c-format
 msgid "%s: %s"
 msgstr ""
@@ -2052,7 +2052,7 @@ msgstr ""
 msgid "-C                      Send requests using chunking (default)"
 msgstr ""
 
-#: systemv/lpadmin.c:1618
+#: systemv/lpadmin.c:1623
 msgid "-D description          Specify the textual description of the printer"
 msgstr ""
 
@@ -2060,13 +2060,13 @@ msgstr ""
 msgid "-D device-uri           Set the device URI for the printer"
 msgstr ""
 
-#: systemv/lpadmin.c:1620
+#: systemv/lpadmin.c:1625
 msgid "-E                      Enable and accept jobs on the printer (after -p)"
 msgstr ""
 
 #: berkeley/lpq.c:644 berkeley/lpr.c:433 berkeley/lprm.c:234
 #: systemv/cancel.c:403 systemv/cupsaccept.c:244 systemv/cupsctl.c:233
-#: systemv/lp.c:752 systemv/lpadmin.c:1619 systemv/lpinfo.c:498
+#: systemv/lp.c:752 systemv/lpadmin.c:1624 systemv/lpinfo.c:498
 #: systemv/lpmove.c:217 systemv/lpoptions.c:540 systemv/lpstat.c:2045
 msgid "-E                      Encrypt the connection to the server"
 msgstr ""
@@ -2075,7 +2075,7 @@ msgstr ""
 msgid "-E                      Test with encryption using HTTP Upgrade to TLS"
 msgstr ""
 
-#: scheduler/main.c:2115
+#: scheduler/main.c:2136
 msgid "-F                      Run in the foreground but detach from console."
 msgstr ""
 
@@ -2129,7 +2129,7 @@ msgstr ""
 msgid "-L                      Send requests using content-length"
 msgstr ""
 
-#: systemv/lpadmin.c:1623
+#: systemv/lpadmin.c:1628
 msgid "-L location             Specify the textual location of the printer"
 msgstr ""
 
@@ -2165,7 +2165,7 @@ msgstr ""
 msgid "-R                      Show the ranking of jobs"
 msgstr ""
 
-#: systemv/lpadmin.c:1643
+#: systemv/lpadmin.c:1648
 msgid "-R name-default         Remove the default value for the named option"
 msgstr ""
 
@@ -2191,7 +2191,7 @@ msgstr ""
 
 #: berkeley/lpq.c:648 berkeley/lpr.c:452 berkeley/lprm.c:237
 #: systemv/cancel.c:406 systemv/cupsaccept.c:247 systemv/lp.c:778
-#: systemv/lpadmin.c:1647 systemv/lpinfo.c:502 systemv/lpmove.c:219
+#: systemv/lpadmin.c:1652 systemv/lpinfo.c:502 systemv/lpmove.c:219
 #: systemv/lpoptions.c:545 systemv/lpstat.c:2048
 msgid "-U username             Specify the username to use for authentication"
 msgstr ""
@@ -2250,7 +2250,7 @@ msgstr ""
 msgid "-c [class(es)]          Show classes and their member printers"
 msgstr ""
 
-#: systemv/lpadmin.c:1616
+#: systemv/lpadmin.c:1621
 msgid "-c class                Add the named destination to a class"
 msgstr ""
 
@@ -2258,7 +2258,7 @@ msgstr ""
 msgid "-c command              Set print command"
 msgstr ""
 
-#: scheduler/main.c:2113
+#: scheduler/main.c:2134
 msgid "-c cupsd.conf           Set cupsd.conf file to use."
 msgstr ""
 
@@ -2270,7 +2270,7 @@ msgstr ""
 msgid "-d destination          Set default destination"
 msgstr ""
 
-#: systemv/lpadmin.c:1617
+#: systemv/lpadmin.c:1622
 msgid "-d destination          Set the named destination as the server default"
 msgstr ""
 
@@ -2290,7 +2290,7 @@ msgstr ""
 msgid "-e                      Show available destinations on the network"
 msgstr ""
 
-#: scheduler/main.c:2114
+#: scheduler/main.c:2135
 msgid "-f                      Run in the foreground."
 msgstr ""
 
@@ -2302,7 +2302,7 @@ msgstr ""
 msgid "-f type/subtype[,...]   Set supported file types"
 msgstr ""
 
-#: scheduler/main.c:2116
+#: scheduler/main.c:2137
 msgid "-h                      Show this usage message."
 msgstr ""
 
@@ -2316,7 +2316,7 @@ msgstr ""
 
 #: berkeley/lpq.c:645 berkeley/lprm.c:235 systemv/cancel.c:404
 #: systemv/cupsaccept.c:245 systemv/cupsctl.c:234 systemv/lp.c:753
-#: systemv/lpadmin.c:1621 systemv/lpinfo.c:499 systemv/lpmove.c:218
+#: systemv/lpadmin.c:1626 systemv/lpinfo.c:499 systemv/lpmove.c:218
 #: systemv/lpoptions.c:541 systemv/lpstat.c:2046
 msgid "-h server[:port]        Connect to the named server and port"
 msgstr ""
@@ -2329,7 +2329,7 @@ msgstr ""
 msgid "-i id                   Specify an existing job ID to modify"
 msgstr ""
 
-#: systemv/lpadmin.c:1622
+#: systemv/lpadmin.c:1627
 msgid "-i ppd-file             Specify a PPD file for the printer"
 msgstr ""
 
@@ -2349,7 +2349,7 @@ msgstr ""
 msgid "-l                      Produce plain text output"
 msgstr ""
 
-#: scheduler/main.c:2118
+#: scheduler/main.c:2139
 msgid "-l                      Run cupsd on demand."
 msgstr ""
 
@@ -2373,7 +2373,7 @@ msgstr ""
 msgid "-m                      Show models"
 msgstr ""
 
-#: systemv/lpadmin.c:1625
+#: systemv/lpadmin.c:1630
 msgid "-m everywhere           Specify the printer is compatible with IPP Everywhere"
 msgstr ""
 
@@ -2381,7 +2381,7 @@ msgstr ""
 msgid "-m model                Set model name (default=Printer)"
 msgstr ""
 
-#: systemv/lpadmin.c:1624
+#: systemv/lpadmin.c:1629
 msgid "-m model                Specify a standard model/PPD file for the printer"
 msgstr ""
 
@@ -2401,7 +2401,7 @@ msgstr ""
 msgid "-n regex                Match service name to regular expression"
 msgstr ""
 
-#: systemv/lpadmin.c:1627
+#: systemv/lpadmin.c:1632
 msgid "-o Name=Value           Specify the default value for the named PPD option "
 msgstr ""
 
@@ -2409,27 +2409,27 @@ msgstr ""
 msgid "-o [destination(s)]     Show jobs"
 msgstr ""
 
-#: systemv/lpadmin.c:1628
+#: systemv/lpadmin.c:1633
 msgid ""
 "-o cupsIPPSupplies=false\n"
 "                        Disable supply level reporting via IPP"
 msgstr ""
 
-#: systemv/lpadmin.c:1630
+#: systemv/lpadmin.c:1635
 msgid ""
 "-o cupsSNMPSupplies=false\n"
 "                        Disable supply level reporting via SNMP"
 msgstr ""
 
-#: systemv/lpadmin.c:1632
+#: systemv/lpadmin.c:1637
 msgid "-o job-k-limit=N        Specify the kilobyte limit for per-user quotas"
 msgstr ""
 
-#: systemv/lpadmin.c:1633
+#: systemv/lpadmin.c:1638
 msgid "-o job-page-limit=N     Specify the page limit for per-user quotas"
 msgstr ""
 
-#: systemv/lpadmin.c:1634
+#: systemv/lpadmin.c:1639
 msgid "-o job-quota-period=N   Specify the per-user quota period in seconds"
 msgstr ""
 
@@ -2441,7 +2441,7 @@ msgstr ""
 msgid "-o media=size           Specify the media size to use"
 msgstr ""
 
-#: systemv/lpadmin.c:1626
+#: systemv/lpadmin.c:1631
 msgid "-o name-default=value   Specify the default value for the named option"
 msgstr ""
 
@@ -2467,19 +2467,19 @@ msgstr ""
 msgid "-o print-quality=N      Specify the print quality - draft (3), normal (4), or best (5)"
 msgstr ""
 
-#: systemv/lpadmin.c:1635
+#: systemv/lpadmin.c:1640
 msgid ""
 "-o printer-error-policy=name\n"
 "                        Specify the printer error policy"
 msgstr ""
 
-#: systemv/lpadmin.c:1637
+#: systemv/lpadmin.c:1642
 msgid ""
 "-o printer-is-shared=true\n"
 "                        Share the printer"
 msgstr ""
 
-#: systemv/lpadmin.c:1639
+#: systemv/lpadmin.c:1644
 msgid ""
 "-o printer-op-policy=name\n"
 "                        Specify the printer operation policy"
@@ -2513,7 +2513,7 @@ msgstr ""
 msgid "-p destination          Specify a destination"
 msgstr ""
 
-#: systemv/lpadmin.c:1641
+#: systemv/lpadmin.c:1646
 msgid "-p destination          Specify/add the named destination"
 msgstr ""
 
@@ -2553,7 +2553,7 @@ msgstr ""
 msgid "-r                      Use 'relaxed' open mode"
 msgstr ""
 
-#: systemv/lpadmin.c:1642
+#: systemv/lpadmin.c:1647
 msgid "-r class                Remove the named destination from a class"
 msgstr ""
 
@@ -2577,7 +2577,7 @@ msgstr ""
 msgid "-s                      Show a status summary"
 msgstr ""
 
-#: scheduler/main.c:2120
+#: scheduler/main.c:2141
 msgid "-s cups-files.conf      Set cups-files.conf file to use."
 msgstr ""
 
@@ -2593,7 +2593,7 @@ msgstr ""
 msgid "-t                      Show all status information"
 msgstr ""
 
-#: scheduler/main.c:2121
+#: scheduler/main.c:2142
 msgid "-t                      Test the configuration file."
 msgstr ""
 
@@ -2609,15 +2609,15 @@ msgstr ""
 msgid "-u [user(s)]            Show jobs queued by the current or specified users"
 msgstr ""
 
-#: systemv/lpadmin.c:1644
+#: systemv/lpadmin.c:1649
 msgid "-u allow:all            Allow all users to print"
 msgstr ""
 
-#: systemv/lpadmin.c:1645
+#: systemv/lpadmin.c:1650
 msgid "-u allow:list           Allow the list of users or groups (@name) to print"
 msgstr ""
 
-#: systemv/lpadmin.c:1646
+#: systemv/lpadmin.c:1651
 msgid "-u deny:list            Prevent the list of users or groups (@name) to print"
 msgstr ""
 
@@ -2641,7 +2641,7 @@ msgstr ""
 msgid "-v [printer(s)]         Show the devices for each destination"
 msgstr ""
 
-#: systemv/lpadmin.c:1648
+#: systemv/lpadmin.c:1653
 msgid "-v device-uri           Specify the device URI for the printer"
 msgstr ""
 
@@ -2657,7 +2657,7 @@ msgstr ""
 msgid "-x destination          Remove default options for destination"
 msgstr ""
 
-#: systemv/lpadmin.c:1649
+#: systemv/lpadmin.c:1654
 msgid "-x destination          Remove the named destination"
 msgstr ""
 
@@ -3319,7 +3319,7 @@ msgstr ""
 msgid "?Invalid help command unknown."
 msgstr ""
 
-#: scheduler/ipp.c:2287
+#: scheduler/ipp.c:2283
 #, c-format
 msgid "A class named \"%s\" already exists."
 msgstr ""
@@ -3506,12 +3506,12 @@ msgstr ""
 msgid "Attempt to set %s printer-state to bad value %d."
 msgstr ""
 
-#: scheduler/ipp.c:5427 scheduler/ipp.c:5453
+#: scheduler/ipp.c:5422 scheduler/ipp.c:5448
 #, c-format
 msgid "Attribute \"%s\" is in the wrong group."
 msgstr ""
 
-#: scheduler/ipp.c:5429 scheduler/ipp.c:5455
+#: scheduler/ipp.c:5424 scheduler/ipp.c:5450
 #, c-format
 msgid "Attribute \"%s\" is the wrong value type."
 msgstr ""
@@ -3569,17 +3569,17 @@ msgstr ""
 msgid "B9"
 msgstr ""
 
-#: scheduler/ipp.c:7509
+#: scheduler/ipp.c:7504
 #, c-format
 msgid "Bad \"printer-id\" value %d."
 msgstr ""
 
-#: scheduler/ipp.c:10345
+#: scheduler/ipp.c:10336
 #, c-format
 msgid "Bad '%s' value."
 msgstr ""
 
-#: scheduler/ipp.c:11293
+#: scheduler/ipp.c:11284
 #, c-format
 msgid "Bad 'document-format' value \"%s\"."
 msgstr ""
@@ -3617,7 +3617,7 @@ msgstr ""
 msgid "Bad PPD cache file."
 msgstr ""
 
-#: scheduler/ipp.c:2663
+#: scheduler/ipp.c:2659
 msgid "Bad PPD file."
 msgstr ""
 
@@ -3650,22 +3650,22 @@ msgstr ""
 msgid "Bad custom parameter"
 msgstr ""
 
-#: cups/http-support.c:1746 scheduler/ipp.c:2369
+#: cups/http-support.c:1746 scheduler/ipp.c:2365
 #, c-format
 msgid "Bad device-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2414
+#: scheduler/ipp.c:2410
 #, c-format
 msgid "Bad device-uri scheme \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8491 scheduler/ipp.c:8509 scheduler/ipp.c:9737
+#: scheduler/ipp.c:8486 scheduler/ipp.c:8504 scheduler/ipp.c:9732
 #, c-format
 msgid "Bad document-format \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:9755
+#: scheduler/ipp.c:9750
 #, c-format
 msgid "Bad document-format-default \"%s\"."
 msgstr ""
@@ -3687,7 +3687,7 @@ msgstr ""
 msgid "Bad job-name value: Wrong type or count."
 msgstr ""
 
-#: scheduler/ipp.c:10383
+#: scheduler/ipp.c:10374
 msgid "Bad job-priority value."
 msgstr ""
 
@@ -3700,29 +3700,29 @@ msgstr ""
 msgid "Bad job-sheets value type."
 msgstr ""
 
-#: scheduler/ipp.c:10413
+#: scheduler/ipp.c:10404
 msgid "Bad job-state value."
 msgstr ""
 
-#: scheduler/ipp.c:3010 scheduler/ipp.c:3472 scheduler/ipp.c:6258
-#: scheduler/ipp.c:6405 scheduler/ipp.c:7917 scheduler/ipp.c:8189
-#: scheduler/ipp.c:9055 scheduler/ipp.c:9279 scheduler/ipp.c:9631
-#: scheduler/ipp.c:10244
+#: scheduler/ipp.c:3006 scheduler/ipp.c:3468 scheduler/ipp.c:6253
+#: scheduler/ipp.c:6400 scheduler/ipp.c:7912 scheduler/ipp.c:8184
+#: scheduler/ipp.c:9050 scheduler/ipp.c:9274 scheduler/ipp.c:9626
+#: scheduler/ipp.c:10235
 #, c-format
 msgid "Bad job-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2053 scheduler/ipp.c:5778
+#: scheduler/ipp.c:2049 scheduler/ipp.c:5773
 #, c-format
 msgid "Bad notify-pull-method \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2018 scheduler/ipp.c:5742
+#: scheduler/ipp.c:2014 scheduler/ipp.c:5737
 #, c-format
 msgid "Bad notify-recipient-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:5853
+#: scheduler/ipp.c:5848
 #, c-format
 msgid "Bad notify-user-data \"%s\"."
 msgstr ""
@@ -3741,12 +3741,12 @@ msgstr ""
 msgid "Bad port number in URI"
 msgstr ""
 
-#: scheduler/ipp.c:2460
+#: scheduler/ipp.c:2456
 #, c-format
 msgid "Bad port-monitor \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2541
+#: scheduler/ipp.c:2537
 #, c-format
 msgid "Bad printer-state value %d."
 msgstr ""
@@ -3785,7 +3785,7 @@ msgstr ""
 msgid "Bad/empty URI"
 msgstr ""
 
-#: cgi-bin/admin.c:2794 cgi-bin/admin.c:3040
+#: cgi-bin/admin.c:2794 cgi-bin/admin.c:3043
 msgid "Banners"
 msgstr ""
 
@@ -3822,11 +3822,11 @@ msgstr ""
 msgid "Canceling print job."
 msgstr ""
 
-#: scheduler/ipp.c:963 scheduler/ipp.c:2516
+#: scheduler/ipp.c:963 scheduler/ipp.c:2512
 msgid "Cannot change printer-is-shared for remote queues."
 msgstr ""
 
-#: scheduler/ipp.c:2503
+#: scheduler/ipp.c:2499
 msgid "Cannot share a remote Kerberized printer."
 msgstr ""
 
@@ -3839,7 +3839,7 @@ msgstr ""
 msgid "Change Settings"
 msgstr ""
 
-#: scheduler/ipp.c:2065 scheduler/ipp.c:5790
+#: scheduler/ipp.c:2061 scheduler/ipp.c:5785
 #, c-format
 msgid "Character set \"%s\" not supported."
 msgstr ""
@@ -3852,7 +3852,7 @@ msgstr ""
 msgid "Clean Print Heads"
 msgstr ""
 
-#: scheduler/ipp.c:3924
+#: scheduler/ipp.c:3920
 msgid "Close-Job doesn't support the job-uri attribute."
 msgstr ""
 
@@ -3911,7 +3911,7 @@ msgstr ""
 msgid "Credentials have expired."
 msgstr ""
 
-#: cups/ppd.c:1122 cups/ppd.c:1162 cups/ppd.c:1371 cups/ppd.c:1474
+#: cups/ppd.c:1133 cups/ppd.c:1173 cups/ppd.c:1382 cups/ppd.c:1485
 msgid "Custom"
 msgstr ""
 
@@ -4024,7 +4024,7 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
-#: scheduler/ipp.c:6307
+#: scheduler/ipp.c:6302
 #, c-format
 msgid "Document #%d does not exist in job #%d."
 msgstr ""
@@ -4056,12 +4056,12 @@ msgstr ""
 msgid "Edit Configuration File"
 msgstr ""
 
-#: cups/http.c:4641
+#: cups/http.c:4649
 msgid "Encryption is not supported."
 msgstr ""
 
 #. TRANSLATORS: Banner/cover sheet after the print job.
-#: cgi-bin/admin.c:3065
+#: cgi-bin/admin.c:3068
 msgid "Ending Banner"
 msgstr ""
 
@@ -4069,7 +4069,7 @@ msgstr ""
 msgid "English"
 msgstr ""
 
-#: scheduler/client.c:1980
+#: scheduler/client.c:1981
 msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket."
 msgstr ""
 
@@ -4293,7 +4293,7 @@ msgstr ""
 msgid "Epson"
 msgstr ""
 
-#: cgi-bin/admin.c:3108
+#: cgi-bin/admin.c:3111
 msgid "Error Policy"
 msgstr ""
 
@@ -4403,13 +4403,13 @@ msgstr ""
 msgid "File Folder"
 msgstr ""
 
-#: scheduler/ipp.c:2390
+#: scheduler/ipp.c:2386
 #, c-format
 msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"."
 msgstr ""
 
 #: filter/rastertoepson.c:1131 filter/rastertohp.c:802
-#: filter/rastertolabel.c:1251
+#: filter/rastertolabel.c:1259
 #, c-format
 msgid "Finished page %d."
 msgstr ""
@@ -4434,7 +4434,7 @@ msgstr ""
 msgid "Found"
 msgstr ""
 
-#: cups/ppd.c:753 cups/ppd.c:1275
+#: cups/ppd.c:757 cups/ppd.c:1286
 msgid "General"
 msgstr ""
 
@@ -4450,10 +4450,10 @@ msgstr ""
 msgid "Glossy Paper"
 msgstr ""
 
-#: scheduler/ipp.c:2988 scheduler/ipp.c:3398 scheduler/ipp.c:3936
-#: scheduler/ipp.c:6236 scheduler/ipp.c:6383 scheduler/ipp.c:7894
-#: scheduler/ipp.c:9033 scheduler/ipp.c:9257 scheduler/ipp.c:9609
-#: scheduler/ipp.c:10222
+#: scheduler/ipp.c:2984 scheduler/ipp.c:3394 scheduler/ipp.c:3932
+#: scheduler/ipp.c:6231 scheduler/ipp.c:6378 scheduler/ipp.c:7889
+#: scheduler/ipp.c:9028 scheduler/ipp.c:9252 scheduler/ipp.c:9604
+#: scheduler/ipp.c:10213
 msgid "Got a printer-uri attribute but no job-id."
 msgstr ""
 
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "Hanging Folder"
 msgstr ""
 
-#: cups/hash.c:269
+#: cups/hash.c:292
 msgid "Hash buffer too small."
 msgstr ""
 
@@ -4481,11 +4481,11 @@ msgstr ""
 msgid "High"
 msgstr ""
 
-#: cups/ipp.c:3089 cups/ipp.c:3116 cups/ipp.c:3139
+#: cups/ipp.c:3094 cups/ipp.c:3121 cups/ipp.c:3144
 msgid "IPP 1setOf attribute with incompatible value tags."
 msgstr ""
 
-#: cups/ipp.c:3052
+#: cups/ipp.c:3057
 msgid "IPP attribute has no name."
 msgstr ""
 
@@ -4493,23 +4493,23 @@ msgstr ""
 msgid "IPP attribute is not a member of the message."
 msgstr ""
 
-#: cups/ipp.c:3502
+#: cups/ipp.c:3507
 msgid "IPP begCollection value not 0 bytes."
 msgstr ""
 
-#: cups/ipp.c:3280
+#: cups/ipp.c:3285
 msgid "IPP boolean value not 1 byte."
 msgstr ""
 
-#: cups/ipp.c:3345
+#: cups/ipp.c:3350
 msgid "IPP date value not 11 bytes."
 msgstr ""
 
-#: cups/ipp.c:3523
+#: cups/ipp.c:3528
 msgid "IPP endCollection value not 0 bytes."
 msgstr ""
 
-#: cups/ipp.c:3255
+#: cups/ipp.c:3260
 msgid "IPP enum value not 4 bytes."
 msgstr ""
 
@@ -4517,27 +4517,27 @@ msgstr ""
 msgid "IPP extension tag larger than 0x7FFFFFFF."
 msgstr ""
 
-#: cups/ipp.c:3252
+#: cups/ipp.c:3257
 msgid "IPP integer value not 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:3455
+#: cups/ipp.c:3460
 msgid "IPP language length overflows value."
 msgstr ""
 
-#: cups/ipp.c:3464
+#: cups/ipp.c:3469
 msgid "IPP language length too large."
 msgstr ""
 
-#: cups/ipp.c:3166
+#: cups/ipp.c:3171
 msgid "IPP member name is not empty."
 msgstr ""
 
-#: cups/ipp.c:3549
+#: cups/ipp.c:3554
 msgid "IPP memberName value is empty."
 msgstr ""
 
-#: cups/ipp.c:3541
+#: cups/ipp.c:3546
 msgid "IPP memberName with no attribute."
 msgstr ""
 
@@ -4545,31 +4545,31 @@ msgstr ""
 msgid "IPP name larger than 32767 bytes."
 msgstr ""
 
-#: cups/ipp.c:3422
+#: cups/ipp.c:3427
 msgid "IPP nameWithLanguage value less than minimum 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:3580
+#: cups/ipp.c:3585
 msgid "IPP octetString length too large."
 msgstr ""
 
-#: cups/ipp.c:3390
+#: cups/ipp.c:3395
 msgid "IPP rangeOfInteger value not 8 bytes."
 msgstr ""
 
-#: cups/ipp.c:3363
+#: cups/ipp.c:3368
 msgid "IPP resolution value not 9 bytes."
 msgstr ""
 
-#: cups/ipp.c:3482
+#: cups/ipp.c:3487
 msgid "IPP string length overflows value."
 msgstr ""
 
-#: cups/ipp.c:3418
+#: cups/ipp.c:3423
 msgid "IPP textWithLanguage value less than minimum 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:3238
+#: cups/ipp.c:3243
 msgid "IPP value larger than 32767 bytes."
 msgstr ""
 
@@ -4679,7 +4679,11 @@ msgstr ""
 msgid "Invalid media size."
 msgstr ""
 
-#: scheduler/ipp.c:2709 scheduler/ipp.c:7050
+#: cups/ipp.c:3045
+msgid "Invalid named IPP attribute in collection."
+msgstr ""
+
+#: scheduler/ipp.c:2705 scheduler/ipp.c:7045
 msgid "Invalid ppd-name value."
 msgstr ""
 
@@ -4688,7 +4692,7 @@ msgstr ""
 msgid "Invalid printer command \"%s\"."
 msgstr ""
 
-#: cups/ppd.c:1393
+#: cups/ppd.c:1404
 msgid "JCL"
 msgstr ""
 
@@ -4748,52 +4752,52 @@ msgstr ""
 msgid "JIS B9"
 msgstr ""
 
-#: scheduler/ipp.c:9329
+#: scheduler/ipp.c:9324
 #, c-format
 msgid "Job #%d cannot be restarted - no files."
 msgstr ""
 
-#: scheduler/ipp.c:3028 scheduler/ipp.c:3262 scheduler/ipp.c:3321
-#: scheduler/ipp.c:3500 scheduler/ipp.c:3946 scheduler/ipp.c:5895
-#: scheduler/ipp.c:6276 scheduler/ipp.c:6423 scheduler/ipp.c:6760
-#: scheduler/ipp.c:7735 scheduler/ipp.c:7757 scheduler/ipp.c:7935
-#: scheduler/ipp.c:8163 scheduler/ipp.c:8206 scheduler/ipp.c:9073
-#: scheduler/ipp.c:9297 scheduler/ipp.c:9649 scheduler/ipp.c:10262
+#: scheduler/ipp.c:3024 scheduler/ipp.c:3258 scheduler/ipp.c:3317
+#: scheduler/ipp.c:3496 scheduler/ipp.c:3942 scheduler/ipp.c:5890
+#: scheduler/ipp.c:6271 scheduler/ipp.c:6418 scheduler/ipp.c:6755
+#: scheduler/ipp.c:7730 scheduler/ipp.c:7752 scheduler/ipp.c:7930
+#: scheduler/ipp.c:8158 scheduler/ipp.c:8201 scheduler/ipp.c:9068
+#: scheduler/ipp.c:9292 scheduler/ipp.c:9644 scheduler/ipp.c:10253
 #, c-format
 msgid "Job #%d does not exist."
 msgstr ""
 
-#: scheduler/ipp.c:3532
+#: scheduler/ipp.c:3528
 #, c-format
 msgid "Job #%d is already aborted - can't cancel."
 msgstr ""
 
-#: scheduler/ipp.c:3526
+#: scheduler/ipp.c:3522
 #, c-format
 msgid "Job #%d is already canceled - can't cancel."
 msgstr ""
 
-#: scheduler/ipp.c:3538
+#: scheduler/ipp.c:3534
 #, c-format
 msgid "Job #%d is already completed - can't cancel."
 msgstr ""
 
-#: scheduler/ipp.c:7961 scheduler/ipp.c:8248 scheduler/ipp.c:10277
+#: scheduler/ipp.c:7956 scheduler/ipp.c:8243 scheduler/ipp.c:10268
 #, c-format
 msgid "Job #%d is finished and cannot be altered."
 msgstr ""
 
-#: scheduler/ipp.c:9311
+#: scheduler/ipp.c:9306
 #, c-format
 msgid "Job #%d is not complete."
 msgstr ""
 
-#: scheduler/ipp.c:3043
+#: scheduler/ipp.c:3039
 #, c-format
 msgid "Job #%d is not held for authentication."
 msgstr ""
 
-#: scheduler/ipp.c:9087
+#: scheduler/ipp.c:9082
 #, c-format
 msgid "Job #%d is not held."
 msgstr ""
@@ -4814,7 +4818,7 @@ msgstr ""
 msgid "Job Stopped"
 msgstr ""
 
-#: scheduler/ipp.c:10391
+#: scheduler/ipp.c:10382
 msgid "Job is completed and cannot be changed."
 msgstr ""
 
@@ -4822,11 +4826,11 @@ msgstr ""
 msgid "Job operation failed"
 msgstr ""
 
-#: scheduler/ipp.c:10427 scheduler/ipp.c:10444 scheduler/ipp.c:10455
+#: scheduler/ipp.c:10418 scheduler/ipp.c:10435 scheduler/ipp.c:10446
 msgid "Job state cannot be changed."
 msgstr ""
 
-#: scheduler/ipp.c:9177
+#: scheduler/ipp.c:9172
 msgid "Job subscriptions cannot be renewed."
 msgstr ""
 
@@ -4850,7 +4854,7 @@ msgstr ""
 msgid "Label Top"
 msgstr ""
 
-#: scheduler/ipp.c:2074 scheduler/ipp.c:5799
+#: scheduler/ipp.c:2070 scheduler/ipp.c:5794
 #, c-format
 msgid "Language \"%s\" not supported."
 msgstr ""
@@ -4888,7 +4892,7 @@ msgstr ""
 msgid "Listening on port %d."
 msgstr ""
 
-#: scheduler/ipp.c:5508
+#: scheduler/ipp.c:5503
 msgid "Local printer created."
 msgstr ""
 
@@ -4904,11 +4908,11 @@ msgstr ""
 msgid "Manual Feed"
 msgstr ""
 
-#: cups/ppd.c:800 cups/ppd.c:1330
+#: cups/ppd.c:804 cups/ppd.c:1341
 msgid "Media Size"
 msgstr ""
 
-#: cups/ppd.c:804 cups/ppd.c:1334 ppdc/sample.c:254
+#: cups/ppd.c:808 cups/ppd.c:1345 ppdc/sample.c:254
 msgid "Media Source"
 msgstr ""
 
@@ -4916,7 +4920,7 @@ msgstr ""
 msgid "Media Tracking"
 msgstr ""
 
-#: cups/ppd.c:802 cups/ppd.c:1332 ppdc/sample.c:280
+#: cups/ppd.c:806 cups/ppd.c:1343 ppdc/sample.c:280
 msgid "Media Type"
 msgstr ""
 
@@ -4944,17 +4948,17 @@ msgstr ""
 msgid "Missing asterisk in column 1"
 msgstr ""
 
-#: scheduler/ipp.c:6299
+#: scheduler/ipp.c:6294
 msgid "Missing document-number attribute."
 msgstr ""
 
 #: cgi-bin/admin.c:502 cgi-bin/admin.c:1798 cgi-bin/admin.c:1883
 #: cgi-bin/admin.c:2289 cgi-bin/admin.c:2543 cgi-bin/admin.c:2654
-#: cgi-bin/admin.c:3364
+#: cgi-bin/admin.c:3367
 msgid "Missing form variable"
 msgstr ""
 
-#: scheduler/ipp.c:9703
+#: scheduler/ipp.c:9698
 msgid "Missing last-document attribute in request."
 msgstr ""
 
@@ -4966,7 +4970,7 @@ msgstr ""
 msgid "Missing media-size in media-col."
 msgstr ""
 
-#: scheduler/ipp.c:6900
+#: scheduler/ipp.c:6895
 msgid "Missing notify-subscription-ids attribute."
 msgstr ""
 
@@ -4974,11 +4978,11 @@ msgstr ""
 msgid "Missing option keyword"
 msgstr ""
 
-#: scheduler/ipp.c:3169 scheduler/ipp.c:3194
+#: scheduler/ipp.c:3165 scheduler/ipp.c:3190
 msgid "Missing requesting-user-name attribute."
 msgstr ""
 
-#: scheduler/ipp.c:5425 scheduler/ipp.c:5451
+#: scheduler/ipp.c:5420 scheduler/ipp.c:5446
 #, c-format
 msgid "Missing required attribute \"%s\"."
 msgstr ""
@@ -5064,7 +5068,7 @@ msgstr ""
 msgid "New credentials are older than stored credentials."
 msgstr ""
 
-#: cups/ppd.c:1942
+#: cups/ppd.c:1974
 msgid "No"
 msgstr ""
 
@@ -5092,7 +5096,7 @@ msgstr ""
 msgid "No active connection."
 msgstr ""
 
-#: scheduler/ipp.c:3449
+#: scheduler/ipp.c:3445
 #, c-format
 msgid "No active jobs on %s."
 msgstr ""
@@ -5101,7 +5105,7 @@ msgstr ""
 msgid "No attributes in request."
 msgstr ""
 
-#: scheduler/ipp.c:3070
+#: scheduler/ipp.c:3066
 msgid "No authentication information provided."
 msgstr ""
 
@@ -5117,11 +5121,11 @@ msgstr ""
 msgid "No default destination."
 msgstr ""
 
-#: scheduler/ipp.c:6099
+#: scheduler/ipp.c:6094
 msgid "No default printer."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:418 scheduler/ipp.c:7481
+#: cgi-bin/ipp-var.c:418 scheduler/ipp.c:7476
 msgid "No destinations added."
 msgstr ""
 
@@ -5137,7 +5141,7 @@ msgstr ""
 msgid "No error-status"
 msgstr ""
 
-#: scheduler/ipp.c:8453 scheduler/ipp.c:9717
+#: scheduler/ipp.c:8448 scheduler/ipp.c:9712
 msgid "No file in print request."
 msgstr ""
 
@@ -5150,7 +5154,7 @@ msgid "No name OID"
 msgstr ""
 
 #: filter/rastertoepson.c:1161 filter/rastertohp.c:833
-#: filter/rastertolabel.c:1280
+#: filter/rastertolabel.c:1288
 msgid "No pages were found."
 msgstr ""
 
@@ -5166,15 +5170,15 @@ msgstr ""
 msgid "No printer-uri found for class"
 msgstr ""
 
-#: scheduler/ipp.c:6506
+#: scheduler/ipp.c:6501
 msgid "No printer-uri in request."
 msgstr ""
 
-#: cups/http.c:2209
+#: cups/http.c:2217
 msgid "No request URI."
 msgstr ""
 
-#: cups/http.c:2226
+#: cups/http.c:2234
 msgid "No request protocol version."
 msgstr ""
 
@@ -5190,11 +5194,11 @@ msgstr ""
 msgid "No stored credentials, not valid for name."
 msgstr ""
 
-#: scheduler/ipp.c:5684
+#: scheduler/ipp.c:5679
 msgid "No subscription attributes in request."
 msgstr ""
 
-#: scheduler/ipp.c:7834
+#: scheduler/ipp.c:7829
 msgid "No subscriptions found."
 msgstr ""
 
@@ -5244,7 +5248,7 @@ msgstr ""
 msgid "Not Supported"
 msgstr ""
 
-#: scheduler/ipp.c:1510 scheduler/ipp.c:10988
+#: scheduler/ipp.c:1510 scheduler/ipp.c:10979
 msgid "Not allowed to print."
 msgstr ""
 
@@ -5268,7 +5272,7 @@ msgstr ""
 msgid "Online Help"
 msgstr ""
 
-#: scheduler/ipp.c:5404
+#: scheduler/ipp.c:5399
 msgid "Only local users can create a local printer."
 msgstr ""
 
@@ -5285,7 +5289,7 @@ msgstr ""
 msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
 msgstr ""
 
-#: cgi-bin/admin.c:3135
+#: cgi-bin/admin.c:3138
 msgid "Operation Policy"
 msgstr ""
 
@@ -5299,9 +5303,9 @@ msgid "Options Installed"
 msgstr ""
 
 #: berkeley/lpq.c:642 berkeley/lpr.c:431 berkeley/lprm.c:232
-#: scheduler/cupsfilter.c:1476 scheduler/main.c:2112 systemv/cancel.c:401
+#: scheduler/cupsfilter.c:1476 scheduler/main.c:2133 systemv/cancel.c:401
 #: systemv/cupsaccept.c:243 systemv/cupsctl.c:232 systemv/cupstestppd.c:3857
-#: systemv/lp.c:750 systemv/lpadmin.c:1615 systemv/lpinfo.c:497
+#: systemv/lp.c:750 systemv/lpadmin.c:1620 systemv/lpinfo.c:497
 #: systemv/lpmove.c:216 systemv/lpoptions.c:538 systemv/lpstat.c:2044
 #: tools/ippeveprinter.c:7664 tools/ippfind.c:2765 tools/ipptool.c:4307
 #: ppdc/ppdc.cxx:426 ppdc/ppdhtml.cxx:173 ppdc/ppdi.cxx:119
@@ -5325,7 +5329,7 @@ msgstr ""
 msgid "Out of memory."
 msgstr ""
 
-#: cups/ppd.c:806 cups/ppd.c:1336
+#: cups/ppd.c:810 cups/ppd.c:1347
 msgid "Output Mode"
 msgstr ""
 
@@ -5406,11 +5410,11 @@ msgstr ""
 msgid "Plain Paper"
 msgstr ""
 
-#: cgi-bin/admin.c:2803 cgi-bin/admin.c:3084
+#: cgi-bin/admin.c:2803 cgi-bin/admin.c:3087
 msgid "Policies"
 msgstr ""
 
-#: cgi-bin/admin.c:2810 cgi-bin/admin.c:3153 cgi-bin/admin.c:3166
+#: cgi-bin/admin.c:2810 cgi-bin/admin.c:3156 cgi-bin/admin.c:3169
 msgid "Port Monitor"
 msgstr ""
 
@@ -5494,7 +5498,7 @@ msgstr ""
 msgid "Print job was not accepted."
 msgstr ""
 
-#: scheduler/ipp.c:5470
+#: scheduler/ipp.c:5465
 #, c-format
 msgid "Printer \"%s\" already exists."
 msgstr ""
@@ -5544,7 +5548,7 @@ msgid "Printers"
 msgstr ""
 
 #: filter/rastertoepson.c:1107 filter/rastertohp.c:774
-#: filter/rastertolabel.c:1227
+#: filter/rastertolabel.c:1235
 #, c-format
 msgid "Printing page %d, %u%% complete."
 msgstr ""
@@ -5557,7 +5561,7 @@ msgstr ""
 msgid "Quarto"
 msgstr ""
 
-#: scheduler/ipp.c:1505 scheduler/ipp.c:10983
+#: scheduler/ipp.c:1505 scheduler/ipp.c:10974
 msgid "Quota limit reached."
 msgstr ""
 
@@ -5587,7 +5591,7 @@ msgstr ""
 msgid "Request Entity Too Large"
 msgstr ""
 
-#: cups/ppd.c:808 cups/ppd.c:1338 ppdc/sample.c:231
+#: cups/ppd.c:812 cups/ppd.c:1349 ppdc/sample.c:231
 msgid "Resolution"
 msgstr ""
 
@@ -5619,7 +5623,7 @@ msgstr ""
 msgid "See Other"
 msgstr ""
 
-#: scheduler/ipp.c:7104 scheduler/ipp.c:7123
+#: scheduler/ipp.c:7099 scheduler/ipp.c:7118
 msgid "See remote printer."
 msgstr ""
 
@@ -5668,11 +5672,11 @@ msgstr ""
 msgid "Set Class Options"
 msgstr ""
 
-#: cgi-bin/admin.c:2639 cgi-bin/admin.c:2813 cgi-bin/admin.c:3195
+#: cgi-bin/admin.c:2639 cgi-bin/admin.c:2813 cgi-bin/admin.c:3198
 msgid "Set Printer Options"
 msgstr ""
 
-#: cgi-bin/admin.c:3365 cgi-bin/admin.c:3409 cgi-bin/admin.c:3427
+#: cgi-bin/admin.c:3368 cgi-bin/admin.c:3412 cgi-bin/admin.c:3430
 msgid "Set Publishing"
 msgstr ""
 
@@ -5702,12 +5706,12 @@ msgid "Staple"
 msgstr ""
 
 #. TRANSLATORS: Banner/cover sheet before the print job.
-#: cgi-bin/admin.c:3056
+#: cgi-bin/admin.c:3059
 msgid "Starting Banner"
 msgstr ""
 
 #: filter/rastertoepson.c:1083 filter/rastertohp.c:750
-#: filter/rastertolabel.c:1203
+#: filter/rastertolabel.c:1211
 #, c-format
 msgid "Starting page %d."
 msgstr ""
@@ -5716,8 +5720,8 @@ msgstr ""
 msgid "Statement"
 msgstr ""
 
-#: scheduler/ipp.c:3595 scheduler/ipp.c:6916 scheduler/ipp.c:7641
-#: scheduler/ipp.c:9165
+#: scheduler/ipp.c:3591 scheduler/ipp.c:6911 scheduler/ipp.c:7636
+#: scheduler/ipp.c:9160
 #, c-format
 msgid "Subscription #%d does not exist."
 msgstr ""
@@ -5771,8 +5775,8 @@ msgstr ""
 msgid "The \"%s\" attribute is required for print jobs."
 msgstr ""
 
-#: scheduler/ipp.c:6577 scheduler/ipp.c:6657 scheduler/ipp.c:6670
-#: scheduler/ipp.c:6682 scheduler/ipp.c:6697
+#: scheduler/ipp.c:6572 scheduler/ipp.c:6652 scheduler/ipp.c:6665
+#: scheduler/ipp.c:6677 scheduler/ipp.c:6692
 #, c-format
 msgid "The %s attribute cannot be provided with job-ids."
 msgstr ""
@@ -5782,23 +5786,23 @@ msgstr ""
 msgid "The '%s' Job Status attribute cannot be supplied in a job creation request."
 msgstr ""
 
-#: scheduler/ipp.c:5199
+#: scheduler/ipp.c:5194
 #, c-format
 msgid "The '%s' operation attribute cannot be supplied in a Create-Job request."
 msgstr ""
 
-#: scheduler/ipp.c:7146
+#: scheduler/ipp.c:7141
 #, c-format
 msgid "The PPD file \"%s\" could not be found."
 msgstr ""
 
-#: scheduler/ipp.c:7135
+#: scheduler/ipp.c:7130
 #, c-format
 msgid "The PPD file \"%s\" could not be opened: %s"
 msgstr ""
 
 #: filter/rastertoepson.c:1052 filter/rastertohp.c:721
-#: filter/rastertolabel.c:1167
+#: filter/rastertolabel.c:1175
 msgid "The PPD file could not be opened."
 msgstr ""
 
@@ -5806,11 +5810,11 @@ msgstr ""
 msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
 msgstr ""
 
-#: scheduler/ipp.c:2101
+#: scheduler/ipp.c:2097
 msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
 msgstr ""
 
-#: scheduler/ipp.c:2084 scheduler/ipp.c:5809
+#: scheduler/ipp.c:2080 scheduler/ipp.c:5804
 #, c-format
 msgid "The notify-user-data value is too large (%d > 63 octets)."
 msgstr ""
@@ -5862,14 +5866,14 @@ msgstr ""
 msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/ \\), quotes (' \"), question mark (?), or the pound sign (#)."
 msgstr ""
 
-#: scheduler/ipp.c:762 scheduler/ipp.c:1047 scheduler/ipp.c:3234
-#: scheduler/ipp.c:3415 scheduler/ipp.c:5182 scheduler/ipp.c:5643
-#: scheduler/ipp.c:5977 scheduler/ipp.c:6543 scheduler/ipp.c:7350
-#: scheduler/ipp.c:7406 scheduler/ipp.c:7747 scheduler/ipp.c:8022
-#: scheduler/ipp.c:8111 scheduler/ipp.c:8144 scheduler/ipp.c:8468
-#: scheduler/ipp.c:8875 scheduler/ipp.c:8957 scheduler/ipp.c:10131
-#: scheduler/ipp.c:10593 scheduler/ipp.c:10946 scheduler/ipp.c:11028
-#: scheduler/ipp.c:11357
+#: scheduler/ipp.c:762 scheduler/ipp.c:1047 scheduler/ipp.c:3230
+#: scheduler/ipp.c:3411 scheduler/ipp.c:5177 scheduler/ipp.c:5638
+#: scheduler/ipp.c:5972 scheduler/ipp.c:6538 scheduler/ipp.c:7345
+#: scheduler/ipp.c:7401 scheduler/ipp.c:7742 scheduler/ipp.c:8017
+#: scheduler/ipp.c:8106 scheduler/ipp.c:8139 scheduler/ipp.c:8463
+#: scheduler/ipp.c:8870 scheduler/ipp.c:8952 scheduler/ipp.c:10122
+#: scheduler/ipp.c:10584 scheduler/ipp.c:10937 scheduler/ipp.c:11019
+#: scheduler/ipp.c:11348
 msgid "The printer or class does not exist."
 msgstr ""
 
@@ -5877,12 +5881,12 @@ msgstr ""
 msgid "The printer or class is not shared."
 msgstr ""
 
-#: scheduler/ipp.c:868 scheduler/ipp.c:2265
+#: scheduler/ipp.c:868 scheduler/ipp.c:2261
 #, c-format
 msgid "The printer-uri \"%s\" contains invalid characters."
 msgstr ""
 
-#: scheduler/ipp.c:3211
+#: scheduler/ipp.c:3207
 msgid "The printer-uri attribute is required."
 msgstr ""
 
@@ -5890,20 +5894,20 @@ msgstr ""
 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
 msgstr ""
 
-#: scheduler/ipp.c:2249
+#: scheduler/ipp.c:2245
 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
 msgstr ""
 
-#: scheduler/client.c:2002
+#: scheduler/client.c:2003
 msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it."
 msgstr ""
 
-#: scheduler/ipp.c:6641
+#: scheduler/ipp.c:6636
 #, c-format
 msgid "The which-jobs value \"%s\" is not supported."
 msgstr ""
 
-#: scheduler/ipp.c:5906
+#: scheduler/ipp.c:5901
 msgid "There are too many subscriptions."
 msgstr ""
 
@@ -5925,7 +5929,7 @@ msgstr ""
 msgid "Too many job-sheets values (%d > 2)."
 msgstr ""
 
-#: scheduler/ipp.c:2578
+#: scheduler/ipp.c:2574
 #, c-format
 msgid "Too many printer-state-reasons values (%d > %d)."
 msgstr ""
@@ -6052,7 +6056,7 @@ msgstr ""
 msgid "Unable to change printer"
 msgstr ""
 
-#: cgi-bin/admin.c:3410
+#: cgi-bin/admin.c:3413
 msgid "Unable to change printer-is-shared attribute"
 msgstr ""
 
@@ -6083,12 +6087,12 @@ msgstr ""
 msgid "Unable to contact printer, queuing on next printer in class."
 msgstr ""
 
-#: scheduler/ipp.c:2680
+#: scheduler/ipp.c:2676
 #, c-format
 msgid "Unable to copy PPD file - %s"
 msgstr ""
 
-#: scheduler/ipp.c:2725
+#: scheduler/ipp.c:2721
 msgid "Unable to copy PPD file."
 msgstr ""
 
@@ -6100,7 +6104,7 @@ msgstr ""
 msgid "Unable to create printer-uri"
 msgstr ""
 
-#: scheduler/ipp.c:5480
+#: scheduler/ipp.c:5475
 msgid "Unable to create printer."
 msgstr ""
 
@@ -6261,7 +6265,7 @@ msgstr ""
 msgid "Unable to open device file"
 msgstr ""
 
-#: scheduler/ipp.c:6320
+#: scheduler/ipp.c:6315
 #, c-format
 msgid "Unable to open document #%d in job #%d."
 msgstr ""
@@ -6277,7 +6281,7 @@ msgid "Unable to open print file"
 msgstr ""
 
 #: filter/rastertoepson.c:1012 filter/rastertohp.c:681
-#: filter/rastertolabel.c:1125
+#: filter/rastertolabel.c:1133
 msgid "Unable to open raster file"
 msgstr ""
 
@@ -6296,7 +6300,7 @@ msgstr ""
 msgid "Unable to register \"%s.%s\": %d"
 msgstr ""
 
-#: scheduler/ipp.c:8627 scheduler/ipp.c:9870
+#: scheduler/ipp.c:8622 scheduler/ipp.c:9865
 msgid "Unable to rename job document file."
 msgstr ""
 
@@ -6316,7 +6320,7 @@ msgstr ""
 msgid "Unable to send data to printer."
 msgstr ""
 
-#: cgi-bin/admin.c:3311
+#: cgi-bin/admin.c:3314
 msgid "Unable to set options"
 msgstr ""
 
@@ -6349,7 +6353,7 @@ msgstr ""
 msgid "Unauthorized"
 msgstr ""
 
-#: cgi-bin/admin.c:3007
+#: cgi-bin/admin.c:3010
 msgid "Units"
 msgstr ""
 
@@ -6382,7 +6386,7 @@ msgstr ""
 msgid "Unknown format character: \"%c\"."
 msgstr ""
 
-#: cups/hash.c:259
+#: cups/hash.c:278
 msgid "Unknown hash algorithm."
 msgstr ""
 
@@ -6405,21 +6409,21 @@ msgstr ""
 msgid "Unknown print mode: \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:10815
+#: scheduler/ipp.c:10806
 #, c-format
 msgid "Unknown printer-error-policy \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:10798
+#: scheduler/ipp.c:10789
 #, c-format
 msgid "Unknown printer-op-policy \"%s\"."
 msgstr ""
 
-#: cups/http.c:2258
+#: cups/http.c:2266
 msgid "Unknown request method."
 msgstr ""
 
-#: cups/http.c:2278
+#: cups/http.c:2286
 msgid "Unknown request version."
 msgstr ""
 
@@ -6436,21 +6440,21 @@ msgstr ""
 msgid "Unknown version option value: \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:11274
+#: scheduler/ipp.c:11265
 #, c-format
 msgid "Unsupported 'compression' value \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:11304
+#: scheduler/ipp.c:11295
 #, c-format
 msgid "Unsupported 'document-format' value \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:7974 scheduler/ipp.c:10357 scheduler/ipp.c:11318
+#: scheduler/ipp.c:7969 scheduler/ipp.c:10348 scheduler/ipp.c:11309
 msgid "Unsupported 'job-hold-until' value."
 msgstr ""
 
-#: scheduler/ipp.c:11334
+#: scheduler/ipp.c:11325
 msgid "Unsupported 'job-name' value."
 msgstr ""
 
@@ -6459,17 +6463,17 @@ msgstr ""
 msgid "Unsupported character set \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8434 scheduler/ipp.c:9682
+#: scheduler/ipp.c:8429 scheduler/ipp.c:9677
 #, c-format
 msgid "Unsupported compression \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8570 scheduler/ipp.c:9835
+#: scheduler/ipp.c:8565 scheduler/ipp.c:9830
 #, c-format
 msgid "Unsupported document-format \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:9818
+#: scheduler/ipp.c:9813
 #, c-format
 msgid "Unsupported document-format \"%s/%s\"."
 msgstr ""
@@ -6539,7 +6543,7 @@ msgstr ""
 msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
 msgstr ""
 
-#: scheduler/main.c:2111
+#: scheduler/main.c:2132
 msgid "Usage: cupsd [options]"
 msgstr ""
 
@@ -6575,7 +6579,7 @@ msgid ""
 "       lp [options] -i id"
 msgstr ""
 
-#: systemv/lpadmin.c:1610
+#: systemv/lpadmin.c:1615
 msgid ""
 "Usage: lpadmin [options] -d destination\n"
 "       lpadmin [options] -p destination\n"
@@ -6683,20 +6687,20 @@ msgstr ""
 msgid "Web Interface is Disabled"
 msgstr ""
 
-#: cups/ppd.c:1940
+#: cups/ppd.c:1972
 msgid "Yes"
 msgstr ""
 
-#: scheduler/client.c:1990
+#: scheduler/client.c:1991
 msgid "You cannot access this page."
 msgstr ""
 
-#: scheduler/client.c:1996
+#: scheduler/client.c:1997
 #, c-format
 msgid "You must access this page using the URL https://%s:%d%s."
 msgstr ""
 
-#: scheduler/client.c:1988
+#: scheduler/client.c:1989
 msgid "Your account does not have the necessary privileges."
 msgstr ""
 
@@ -7065,11 +7069,11 @@ msgstr ""
 msgid "covering-name.pre-printed"
 msgstr ""
 
-#: scheduler/ipp.c:6192
+#: scheduler/ipp.c:6187
 msgid "cups-deviced failed to execute."
 msgstr ""
 
-#: scheduler/ipp.c:7078 scheduler/ipp.c:7317
+#: scheduler/ipp.c:7073 scheduler/ipp.c:7312
 msgid "cups-driverd failed to execute."
 msgstr ""
 
@@ -7449,11 +7453,6 @@ msgstr ""
 msgid "document-state.9"
 msgstr ""
 
-#. TRANSLATORS: End Power State
-#: locale/ipp-strings.c:254
-msgid "end-power-state"
-msgstr ""
-
 #: cups/snmp.c:990
 msgid "error-index uses indefinite length"
 msgstr ""
@@ -7479,1247 +7478,1247 @@ msgid "expression expression   Logical AND"
 msgstr ""
 
 #. TRANSLATORS: Feed Orientation
-#: locale/ipp-strings.c:256
+#: locale/ipp-strings.c:254
 msgid "feed-orientation"
 msgstr ""
 
 #. TRANSLATORS: Long Edge First
-#: locale/ipp-strings.c:258
+#: locale/ipp-strings.c:256
 msgid "feed-orientation.long-edge-first"
 msgstr ""
 
 #. TRANSLATORS: Short Edge First
-#: locale/ipp-strings.c:260
+#: locale/ipp-strings.c:258
 msgid "feed-orientation.short-edge-first"
 msgstr ""
 
 #. TRANSLATORS: Fetch Status Code
-#: locale/ipp-strings.c:262
+#: locale/ipp-strings.c:260
 msgid "fetch-status-code"
 msgstr ""
 
 #. TRANSLATORS: Finishing Template
-#: locale/ipp-strings.c:264
+#: locale/ipp-strings.c:262
 msgid "finishing-template"
 msgstr ""
 
 #. TRANSLATORS: Bale
-#: locale/ipp-strings.c:266
+#: locale/ipp-strings.c:264
 msgid "finishing-template.bale"
 msgstr ""
 
 #. TRANSLATORS: Bind
-#: locale/ipp-strings.c:268
+#: locale/ipp-strings.c:266
 msgid "finishing-template.bind"
 msgstr ""
 
 #. TRANSLATORS: Bind Bottom
-#: locale/ipp-strings.c:270
+#: locale/ipp-strings.c:268
 msgid "finishing-template.bind-bottom"
 msgstr ""
 
 #. TRANSLATORS: Bind Left
-#: locale/ipp-strings.c:272
+#: locale/ipp-strings.c:270
 msgid "finishing-template.bind-left"
 msgstr ""
 
 #. TRANSLATORS: Bind Right
-#: locale/ipp-strings.c:274
+#: locale/ipp-strings.c:272
 msgid "finishing-template.bind-right"
 msgstr ""
 
 #. TRANSLATORS: Bind Top
-#: locale/ipp-strings.c:276
+#: locale/ipp-strings.c:274
 msgid "finishing-template.bind-top"
 msgstr ""
 
 #. TRANSLATORS: Booklet Maker
-#: locale/ipp-strings.c:278
+#: locale/ipp-strings.c:276
 msgid "finishing-template.booklet-maker"
 msgstr ""
 
 #. TRANSLATORS: Coat
-#: locale/ipp-strings.c:280
+#: locale/ipp-strings.c:278
 msgid "finishing-template.coat"
 msgstr ""
 
 #. TRANSLATORS: Cover
-#: locale/ipp-strings.c:282
+#: locale/ipp-strings.c:280
 msgid "finishing-template.cover"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch
-#: locale/ipp-strings.c:284
+#: locale/ipp-strings.c:282
 msgid "finishing-template.edge-stitch"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch Bottom
-#: locale/ipp-strings.c:286
+#: locale/ipp-strings.c:284
 msgid "finishing-template.edge-stitch-bottom"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch Left
-#: locale/ipp-strings.c:288
+#: locale/ipp-strings.c:286
 msgid "finishing-template.edge-stitch-left"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch Right
-#: locale/ipp-strings.c:290
+#: locale/ipp-strings.c:288
 msgid "finishing-template.edge-stitch-right"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch Top
-#: locale/ipp-strings.c:292
+#: locale/ipp-strings.c:290
 msgid "finishing-template.edge-stitch-top"
 msgstr ""
 
 #. TRANSLATORS: Fold
-#: locale/ipp-strings.c:294
+#: locale/ipp-strings.c:292
 msgid "finishing-template.fold"
 msgstr ""
 
 #. TRANSLATORS: Accordion Fold
-#: locale/ipp-strings.c:296
+#: locale/ipp-strings.c:294
 msgid "finishing-template.fold-accordion"
 msgstr ""
 
 #. TRANSLATORS: Double Gate Fold
-#: locale/ipp-strings.c:298
+#: locale/ipp-strings.c:296
 msgid "finishing-template.fold-double-gate"
 msgstr ""
 
 #. TRANSLATORS: Engineering Z Fold
-#: locale/ipp-strings.c:300
+#: locale/ipp-strings.c:298
 msgid "finishing-template.fold-engineering-z"
 msgstr ""
 
 #. TRANSLATORS: Gate Fold
-#: locale/ipp-strings.c:302
+#: locale/ipp-strings.c:300
 msgid "finishing-template.fold-gate"
 msgstr ""
 
 #. TRANSLATORS: Half Fold
-#: locale/ipp-strings.c:304
+#: locale/ipp-strings.c:302
 msgid "finishing-template.fold-half"
 msgstr ""
 
 #. TRANSLATORS: Half Z Fold
-#: locale/ipp-strings.c:306
+#: locale/ipp-strings.c:304
 msgid "finishing-template.fold-half-z"
 msgstr ""
 
 #. TRANSLATORS: Left Gate Fold
-#: locale/ipp-strings.c:308
+#: locale/ipp-strings.c:306
 msgid "finishing-template.fold-left-gate"
 msgstr ""
 
 #. TRANSLATORS: Letter Fold
-#: locale/ipp-strings.c:310
+#: locale/ipp-strings.c:308
 msgid "finishing-template.fold-letter"
 msgstr ""
 
 #. TRANSLATORS: Parallel Fold
-#: locale/ipp-strings.c:312
+#: locale/ipp-strings.c:310
 msgid "finishing-template.fold-parallel"
 msgstr ""
 
 #. TRANSLATORS: Poster Fold
-#: locale/ipp-strings.c:314
+#: locale/ipp-strings.c:312
 msgid "finishing-template.fold-poster"
 msgstr ""
 
 #. TRANSLATORS: Right Gate Fold
-#: locale/ipp-strings.c:316
+#: locale/ipp-strings.c:314
 msgid "finishing-template.fold-right-gate"
 msgstr ""
 
 #. TRANSLATORS: Z Fold
-#: locale/ipp-strings.c:318
+#: locale/ipp-strings.c:316
 msgid "finishing-template.fold-z"
 msgstr ""
 
 #. TRANSLATORS: JDF F10-1
-#: locale/ipp-strings.c:320
+#: locale/ipp-strings.c:318
 msgid "finishing-template.jdf-f10-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F10-2
-#: locale/ipp-strings.c:322
+#: locale/ipp-strings.c:320
 msgid "finishing-template.jdf-f10-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F10-3
-#: locale/ipp-strings.c:324
+#: locale/ipp-strings.c:322
 msgid "finishing-template.jdf-f10-3"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-1
-#: locale/ipp-strings.c:326
+#: locale/ipp-strings.c:324
 msgid "finishing-template.jdf-f12-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-10
-#: locale/ipp-strings.c:328
+#: locale/ipp-strings.c:326
 msgid "finishing-template.jdf-f12-10"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-11
-#: locale/ipp-strings.c:330
+#: locale/ipp-strings.c:328
 msgid "finishing-template.jdf-f12-11"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-12
-#: locale/ipp-strings.c:332
+#: locale/ipp-strings.c:330
 msgid "finishing-template.jdf-f12-12"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-13
-#: locale/ipp-strings.c:334
+#: locale/ipp-strings.c:332
 msgid "finishing-template.jdf-f12-13"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-14
-#: locale/ipp-strings.c:336
+#: locale/ipp-strings.c:334
 msgid "finishing-template.jdf-f12-14"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-2
-#: locale/ipp-strings.c:338
+#: locale/ipp-strings.c:336
 msgid "finishing-template.jdf-f12-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-3
-#: locale/ipp-strings.c:340
+#: locale/ipp-strings.c:338
 msgid "finishing-template.jdf-f12-3"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-4
-#: locale/ipp-strings.c:342
+#: locale/ipp-strings.c:340
 msgid "finishing-template.jdf-f12-4"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-5
-#: locale/ipp-strings.c:344
+#: locale/ipp-strings.c:342
 msgid "finishing-template.jdf-f12-5"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-6
-#: locale/ipp-strings.c:346
+#: locale/ipp-strings.c:344
 msgid "finishing-template.jdf-f12-6"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-7
-#: locale/ipp-strings.c:348
+#: locale/ipp-strings.c:346
 msgid "finishing-template.jdf-f12-7"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-8
-#: locale/ipp-strings.c:350
+#: locale/ipp-strings.c:348
 msgid "finishing-template.jdf-f12-8"
 msgstr ""
 
 #. TRANSLATORS: JDF F12-9
-#: locale/ipp-strings.c:352
+#: locale/ipp-strings.c:350
 msgid "finishing-template.jdf-f12-9"
 msgstr ""
 
 #. TRANSLATORS: JDF F14-1
-#: locale/ipp-strings.c:354
+#: locale/ipp-strings.c:352
 msgid "finishing-template.jdf-f14-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-1
-#: locale/ipp-strings.c:356
+#: locale/ipp-strings.c:354
 msgid "finishing-template.jdf-f16-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-10
-#: locale/ipp-strings.c:358
+#: locale/ipp-strings.c:356
 msgid "finishing-template.jdf-f16-10"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-11
-#: locale/ipp-strings.c:360
+#: locale/ipp-strings.c:358
 msgid "finishing-template.jdf-f16-11"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-12
-#: locale/ipp-strings.c:362
+#: locale/ipp-strings.c:360
 msgid "finishing-template.jdf-f16-12"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-13
-#: locale/ipp-strings.c:364
+#: locale/ipp-strings.c:362
 msgid "finishing-template.jdf-f16-13"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-14
-#: locale/ipp-strings.c:366
+#: locale/ipp-strings.c:364
 msgid "finishing-template.jdf-f16-14"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-2
-#: locale/ipp-strings.c:368
+#: locale/ipp-strings.c:366
 msgid "finishing-template.jdf-f16-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-3
-#: locale/ipp-strings.c:370
+#: locale/ipp-strings.c:368
 msgid "finishing-template.jdf-f16-3"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-4
-#: locale/ipp-strings.c:372
+#: locale/ipp-strings.c:370
 msgid "finishing-template.jdf-f16-4"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-5
-#: locale/ipp-strings.c:374
+#: locale/ipp-strings.c:372
 msgid "finishing-template.jdf-f16-5"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-6
-#: locale/ipp-strings.c:376
+#: locale/ipp-strings.c:374
 msgid "finishing-template.jdf-f16-6"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-7
-#: locale/ipp-strings.c:378
+#: locale/ipp-strings.c:376
 msgid "finishing-template.jdf-f16-7"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-8
-#: locale/ipp-strings.c:380
+#: locale/ipp-strings.c:378
 msgid "finishing-template.jdf-f16-8"
 msgstr ""
 
 #. TRANSLATORS: JDF F16-9
-#: locale/ipp-strings.c:382
+#: locale/ipp-strings.c:380
 msgid "finishing-template.jdf-f16-9"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-1
-#: locale/ipp-strings.c:384
+#: locale/ipp-strings.c:382
 msgid "finishing-template.jdf-f18-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-2
-#: locale/ipp-strings.c:386
+#: locale/ipp-strings.c:384
 msgid "finishing-template.jdf-f18-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-3
-#: locale/ipp-strings.c:388
+#: locale/ipp-strings.c:386
 msgid "finishing-template.jdf-f18-3"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-4
-#: locale/ipp-strings.c:390
+#: locale/ipp-strings.c:388
 msgid "finishing-template.jdf-f18-4"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-5
-#: locale/ipp-strings.c:392
+#: locale/ipp-strings.c:390
 msgid "finishing-template.jdf-f18-5"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-6
-#: locale/ipp-strings.c:394
+#: locale/ipp-strings.c:392
 msgid "finishing-template.jdf-f18-6"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-7
-#: locale/ipp-strings.c:396
+#: locale/ipp-strings.c:394
 msgid "finishing-template.jdf-f18-7"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-8
-#: locale/ipp-strings.c:398
+#: locale/ipp-strings.c:396
 msgid "finishing-template.jdf-f18-8"
 msgstr ""
 
 #. TRANSLATORS: JDF F18-9
-#: locale/ipp-strings.c:400
+#: locale/ipp-strings.c:398
 msgid "finishing-template.jdf-f18-9"
 msgstr ""
 
 #. TRANSLATORS: JDF F2-1
-#: locale/ipp-strings.c:402
+#: locale/ipp-strings.c:400
 msgid "finishing-template.jdf-f2-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F20-1
-#: locale/ipp-strings.c:404
+#: locale/ipp-strings.c:402
 msgid "finishing-template.jdf-f20-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F20-2
-#: locale/ipp-strings.c:406
+#: locale/ipp-strings.c:404
 msgid "finishing-template.jdf-f20-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-1
-#: locale/ipp-strings.c:408
+#: locale/ipp-strings.c:406
 msgid "finishing-template.jdf-f24-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-10
-#: locale/ipp-strings.c:410
+#: locale/ipp-strings.c:408
 msgid "finishing-template.jdf-f24-10"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-11
-#: locale/ipp-strings.c:412
+#: locale/ipp-strings.c:410
 msgid "finishing-template.jdf-f24-11"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-2
-#: locale/ipp-strings.c:414
+#: locale/ipp-strings.c:412
 msgid "finishing-template.jdf-f24-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-3
-#: locale/ipp-strings.c:416
+#: locale/ipp-strings.c:414
 msgid "finishing-template.jdf-f24-3"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-4
-#: locale/ipp-strings.c:418
+#: locale/ipp-strings.c:416
 msgid "finishing-template.jdf-f24-4"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-5
-#: locale/ipp-strings.c:420
+#: locale/ipp-strings.c:418
 msgid "finishing-template.jdf-f24-5"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-6
-#: locale/ipp-strings.c:422
+#: locale/ipp-strings.c:420
 msgid "finishing-template.jdf-f24-6"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-7
-#: locale/ipp-strings.c:424
+#: locale/ipp-strings.c:422
 msgid "finishing-template.jdf-f24-7"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-8
-#: locale/ipp-strings.c:426
+#: locale/ipp-strings.c:424
 msgid "finishing-template.jdf-f24-8"
 msgstr ""
 
 #. TRANSLATORS: JDF F24-9
-#: locale/ipp-strings.c:428
+#: locale/ipp-strings.c:426
 msgid "finishing-template.jdf-f24-9"
 msgstr ""
 
 #. TRANSLATORS: JDF F28-1
-#: locale/ipp-strings.c:430
+#: locale/ipp-strings.c:428
 msgid "finishing-template.jdf-f28-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-1
-#: locale/ipp-strings.c:432
+#: locale/ipp-strings.c:430
 msgid "finishing-template.jdf-f32-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-2
-#: locale/ipp-strings.c:434
+#: locale/ipp-strings.c:432
 msgid "finishing-template.jdf-f32-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-3
-#: locale/ipp-strings.c:436
+#: locale/ipp-strings.c:434
 msgid "finishing-template.jdf-f32-3"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-4
-#: locale/ipp-strings.c:438
+#: locale/ipp-strings.c:436
 msgid "finishing-template.jdf-f32-4"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-5
-#: locale/ipp-strings.c:440
+#: locale/ipp-strings.c:438
 msgid "finishing-template.jdf-f32-5"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-6
-#: locale/ipp-strings.c:442
+#: locale/ipp-strings.c:440
 msgid "finishing-template.jdf-f32-6"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-7
-#: locale/ipp-strings.c:444
+#: locale/ipp-strings.c:442
 msgid "finishing-template.jdf-f32-7"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-8
-#: locale/ipp-strings.c:446
+#: locale/ipp-strings.c:444
 msgid "finishing-template.jdf-f32-8"
 msgstr ""
 
 #. TRANSLATORS: JDF F32-9
-#: locale/ipp-strings.c:448
+#: locale/ipp-strings.c:446
 msgid "finishing-template.jdf-f32-9"
 msgstr ""
 
 #. TRANSLATORS: JDF F36-1
-#: locale/ipp-strings.c:450
+#: locale/ipp-strings.c:448
 msgid "finishing-template.jdf-f36-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F36-2
-#: locale/ipp-strings.c:452
+#: locale/ipp-strings.c:450
 msgid "finishing-template.jdf-f36-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F4-1
-#: locale/ipp-strings.c:454
+#: locale/ipp-strings.c:452
 msgid "finishing-template.jdf-f4-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F4-2
-#: locale/ipp-strings.c:456
+#: locale/ipp-strings.c:454
 msgid "finishing-template.jdf-f4-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F40-1
-#: locale/ipp-strings.c:458
+#: locale/ipp-strings.c:456
 msgid "finishing-template.jdf-f40-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F48-1
-#: locale/ipp-strings.c:460
+#: locale/ipp-strings.c:458
 msgid "finishing-template.jdf-f48-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F48-2
-#: locale/ipp-strings.c:462
+#: locale/ipp-strings.c:460
 msgid "finishing-template.jdf-f48-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F6-1
-#: locale/ipp-strings.c:464
+#: locale/ipp-strings.c:462
 msgid "finishing-template.jdf-f6-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F6-2
-#: locale/ipp-strings.c:466
+#: locale/ipp-strings.c:464
 msgid "finishing-template.jdf-f6-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F6-3
-#: locale/ipp-strings.c:468
+#: locale/ipp-strings.c:466
 msgid "finishing-template.jdf-f6-3"
 msgstr ""
 
 #. TRANSLATORS: JDF F6-4
-#: locale/ipp-strings.c:470
+#: locale/ipp-strings.c:468
 msgid "finishing-template.jdf-f6-4"
 msgstr ""
 
 #. TRANSLATORS: JDF F6-5
-#: locale/ipp-strings.c:472
+#: locale/ipp-strings.c:470
 msgid "finishing-template.jdf-f6-5"
 msgstr ""
 
 #. TRANSLATORS: JDF F6-6
-#: locale/ipp-strings.c:474
+#: locale/ipp-strings.c:472
 msgid "finishing-template.jdf-f6-6"
 msgstr ""
 
 #. TRANSLATORS: JDF F6-7
-#: locale/ipp-strings.c:476
+#: locale/ipp-strings.c:474
 msgid "finishing-template.jdf-f6-7"
 msgstr ""
 
 #. TRANSLATORS: JDF F6-8
-#: locale/ipp-strings.c:478
+#: locale/ipp-strings.c:476
 msgid "finishing-template.jdf-f6-8"
 msgstr ""
 
 #. TRANSLATORS: JDF F64-1
-#: locale/ipp-strings.c:480
+#: locale/ipp-strings.c:478
 msgid "finishing-template.jdf-f64-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F64-2
-#: locale/ipp-strings.c:482
+#: locale/ipp-strings.c:480
 msgid "finishing-template.jdf-f64-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F8-1
-#: locale/ipp-strings.c:484
+#: locale/ipp-strings.c:482
 msgid "finishing-template.jdf-f8-1"
 msgstr ""
 
 #. TRANSLATORS: JDF F8-2
-#: locale/ipp-strings.c:486
+#: locale/ipp-strings.c:484
 msgid "finishing-template.jdf-f8-2"
 msgstr ""
 
 #. TRANSLATORS: JDF F8-3
-#: locale/ipp-strings.c:488
+#: locale/ipp-strings.c:486
 msgid "finishing-template.jdf-f8-3"
 msgstr ""
 
 #. TRANSLATORS: JDF F8-4
-#: locale/ipp-strings.c:490
+#: locale/ipp-strings.c:488
 msgid "finishing-template.jdf-f8-4"
 msgstr ""
 
 #. TRANSLATORS: JDF F8-5
-#: locale/ipp-strings.c:492
+#: locale/ipp-strings.c:490
 msgid "finishing-template.jdf-f8-5"
 msgstr ""
 
 #. TRANSLATORS: JDF F8-6
-#: locale/ipp-strings.c:494
+#: locale/ipp-strings.c:492
 msgid "finishing-template.jdf-f8-6"
 msgstr ""
 
 #. TRANSLATORS: JDF F8-7
-#: locale/ipp-strings.c:496
+#: locale/ipp-strings.c:494
 msgid "finishing-template.jdf-f8-7"
 msgstr ""
 
 #. TRANSLATORS: Jog Offset
-#: locale/ipp-strings.c:498
+#: locale/ipp-strings.c:496
 msgid "finishing-template.jog-offset"
 msgstr ""
 
 #. TRANSLATORS: Laminate
-#: locale/ipp-strings.c:500
+#: locale/ipp-strings.c:498
 msgid "finishing-template.laminate"
 msgstr ""
 
 #. TRANSLATORS: Punch
-#: locale/ipp-strings.c:502
+#: locale/ipp-strings.c:500
 msgid "finishing-template.punch"
 msgstr ""
 
 #. TRANSLATORS: Punch Bottom Left
-#: locale/ipp-strings.c:504
+#: locale/ipp-strings.c:502
 msgid "finishing-template.punch-bottom-left"
 msgstr ""
 
 #. TRANSLATORS: Punch Bottom Right
-#: locale/ipp-strings.c:506
+#: locale/ipp-strings.c:504
 msgid "finishing-template.punch-bottom-right"
 msgstr ""
 
 #. TRANSLATORS: 2-hole Punch Bottom
-#: locale/ipp-strings.c:508
+#: locale/ipp-strings.c:506
 msgid "finishing-template.punch-dual-bottom"
 msgstr ""
 
 #. TRANSLATORS: 2-hole Punch Left
-#: locale/ipp-strings.c:510
+#: locale/ipp-strings.c:508
 msgid "finishing-template.punch-dual-left"
 msgstr ""
 
 #. TRANSLATORS: 2-hole Punch Right
-#: locale/ipp-strings.c:512
+#: locale/ipp-strings.c:510
 msgid "finishing-template.punch-dual-right"
 msgstr ""
 
 #. TRANSLATORS: 2-hole Punch Top
-#: locale/ipp-strings.c:514
+#: locale/ipp-strings.c:512
 msgid "finishing-template.punch-dual-top"
 msgstr ""
 
 #. TRANSLATORS: Multi-hole Punch Bottom
-#: locale/ipp-strings.c:516
+#: locale/ipp-strings.c:514
 msgid "finishing-template.punch-multiple-bottom"
 msgstr ""
 
 #. TRANSLATORS: Multi-hole Punch Left
-#: locale/ipp-strings.c:518
+#: locale/ipp-strings.c:516
 msgid "finishing-template.punch-multiple-left"
 msgstr ""
 
 #. TRANSLATORS: Multi-hole Punch Right
-#: locale/ipp-strings.c:520
+#: locale/ipp-strings.c:518
 msgid "finishing-template.punch-multiple-right"
 msgstr ""
 
 #. TRANSLATORS: Multi-hole Punch Top
-#: locale/ipp-strings.c:522
+#: locale/ipp-strings.c:520
 msgid "finishing-template.punch-multiple-top"
 msgstr ""
 
 #. TRANSLATORS: 4-hole Punch Bottom
-#: locale/ipp-strings.c:524
+#: locale/ipp-strings.c:522
 msgid "finishing-template.punch-quad-bottom"
 msgstr ""
 
 #. TRANSLATORS: 4-hole Punch Left
-#: locale/ipp-strings.c:526
+#: locale/ipp-strings.c:524
 msgid "finishing-template.punch-quad-left"
 msgstr ""
 
 #. TRANSLATORS: 4-hole Punch Right
-#: locale/ipp-strings.c:528
+#: locale/ipp-strings.c:526
 msgid "finishing-template.punch-quad-right"
 msgstr ""
 
 #. TRANSLATORS: 4-hole Punch Top
-#: locale/ipp-strings.c:530
+#: locale/ipp-strings.c:528
 msgid "finishing-template.punch-quad-top"
 msgstr ""
 
 #. TRANSLATORS: Punch Top Left
-#: locale/ipp-strings.c:532
+#: locale/ipp-strings.c:530
 msgid "finishing-template.punch-top-left"
 msgstr ""
 
 #. TRANSLATORS: Punch Top Right
-#: locale/ipp-strings.c:534
+#: locale/ipp-strings.c:532
 msgid "finishing-template.punch-top-right"
 msgstr ""
 
 #. TRANSLATORS: 3-hole Punch Bottom
-#: locale/ipp-strings.c:536
+#: locale/ipp-strings.c:534
 msgid "finishing-template.punch-triple-bottom"
 msgstr ""
 
 #. TRANSLATORS: 3-hole Punch Left
-#: locale/ipp-strings.c:538
+#: locale/ipp-strings.c:536
 msgid "finishing-template.punch-triple-left"
 msgstr ""
 
 #. TRANSLATORS: 3-hole Punch Right
-#: locale/ipp-strings.c:540
+#: locale/ipp-strings.c:538
 msgid "finishing-template.punch-triple-right"
 msgstr ""
 
 #. TRANSLATORS: 3-hole Punch Top
-#: locale/ipp-strings.c:542
+#: locale/ipp-strings.c:540
 msgid "finishing-template.punch-triple-top"
 msgstr ""
 
 #. TRANSLATORS: Saddle Stitch
-#: locale/ipp-strings.c:544
+#: locale/ipp-strings.c:542
 msgid "finishing-template.saddle-stitch"
 msgstr ""
 
 #. TRANSLATORS: Staple
-#: locale/ipp-strings.c:546
+#: locale/ipp-strings.c:544
 msgid "finishing-template.staple"
 msgstr ""
 
 #. TRANSLATORS: Staple Bottom Left
-#: locale/ipp-strings.c:548
+#: locale/ipp-strings.c:546
 msgid "finishing-template.staple-bottom-left"
 msgstr ""
 
 #. TRANSLATORS: Staple Bottom Right
-#: locale/ipp-strings.c:550
+#: locale/ipp-strings.c:548
 msgid "finishing-template.staple-bottom-right"
 msgstr ""
 
 #. TRANSLATORS: 2 Staples on Bottom
-#: locale/ipp-strings.c:552
+#: locale/ipp-strings.c:550
 msgid "finishing-template.staple-dual-bottom"
 msgstr ""
 
 #. TRANSLATORS: 2 Staples on Left
-#: locale/ipp-strings.c:554
+#: locale/ipp-strings.c:552
 msgid "finishing-template.staple-dual-left"
 msgstr ""
 
 #. TRANSLATORS: 2 Staples on Right
-#: locale/ipp-strings.c:556
+#: locale/ipp-strings.c:554
 msgid "finishing-template.staple-dual-right"
 msgstr ""
 
 #. TRANSLATORS: 2 Staples on Top
-#: locale/ipp-strings.c:558
+#: locale/ipp-strings.c:556
 msgid "finishing-template.staple-dual-top"
 msgstr ""
 
 #. TRANSLATORS: Staple Top Left
-#: locale/ipp-strings.c:560
+#: locale/ipp-strings.c:558
 msgid "finishing-template.staple-top-left"
 msgstr ""
 
 #. TRANSLATORS: Staple Top Right
-#: locale/ipp-strings.c:562
+#: locale/ipp-strings.c:560
 msgid "finishing-template.staple-top-right"
 msgstr ""
 
 #. TRANSLATORS: 3 Staples on Bottom
-#: locale/ipp-strings.c:564
+#: locale/ipp-strings.c:562
 msgid "finishing-template.staple-triple-bottom"
 msgstr ""
 
 #. TRANSLATORS: 3 Staples on Left
-#: locale/ipp-strings.c:566
+#: locale/ipp-strings.c:564
 msgid "finishing-template.staple-triple-left"
 msgstr ""
 
 #. TRANSLATORS: 3 Staples on Right
-#: locale/ipp-strings.c:568
+#: locale/ipp-strings.c:566
 msgid "finishing-template.staple-triple-right"
 msgstr ""
 
 #. TRANSLATORS: 3 Staples on Top
-#: locale/ipp-strings.c:570
+#: locale/ipp-strings.c:568
 msgid "finishing-template.staple-triple-top"
 msgstr ""
 
 #. TRANSLATORS: Trim
-#: locale/ipp-strings.c:572
+#: locale/ipp-strings.c:570
 msgid "finishing-template.trim"
 msgstr ""
 
 #. TRANSLATORS: Trim After Every Set
-#: locale/ipp-strings.c:574
+#: locale/ipp-strings.c:572
 msgid "finishing-template.trim-after-copies"
 msgstr ""
 
 #. TRANSLATORS: Trim After Every Document
-#: locale/ipp-strings.c:576
+#: locale/ipp-strings.c:574
 msgid "finishing-template.trim-after-documents"
 msgstr ""
 
 #. TRANSLATORS: Trim After Job
-#: locale/ipp-strings.c:578
+#: locale/ipp-strings.c:576
 msgid "finishing-template.trim-after-job"
 msgstr ""
 
 #. TRANSLATORS: Trim After Every Page
-#: locale/ipp-strings.c:580
+#: locale/ipp-strings.c:578
 msgid "finishing-template.trim-after-pages"
 msgstr ""
 
 #. TRANSLATORS: Finishings
-#: locale/ipp-strings.c:582
+#: locale/ipp-strings.c:580
 msgid "finishings"
 msgstr ""
 
 #. TRANSLATORS: Finishings
-#: locale/ipp-strings.c:584
+#: locale/ipp-strings.c:582
 msgid "finishings-col"
 msgstr ""
 
 #. TRANSLATORS: Fold
-#: locale/ipp-strings.c:586
+#: locale/ipp-strings.c:584
 msgid "finishings.10"
 msgstr ""
 
 #. TRANSLATORS: Z Fold
-#: locale/ipp-strings.c:588
+#: locale/ipp-strings.c:586
 msgid "finishings.100"
 msgstr ""
 
 #. TRANSLATORS: Engineering Z Fold
-#: locale/ipp-strings.c:590
+#: locale/ipp-strings.c:588
 msgid "finishings.101"
 msgstr ""
 
 #. TRANSLATORS: Trim
-#: locale/ipp-strings.c:592
+#: locale/ipp-strings.c:590
 msgid "finishings.11"
 msgstr ""
 
 #. TRANSLATORS: Bale
-#: locale/ipp-strings.c:594
+#: locale/ipp-strings.c:592
 msgid "finishings.12"
 msgstr ""
 
 #. TRANSLATORS: Booklet Maker
-#: locale/ipp-strings.c:596
+#: locale/ipp-strings.c:594
 msgid "finishings.13"
 msgstr ""
 
 #. TRANSLATORS: Jog Offset
-#: locale/ipp-strings.c:598
+#: locale/ipp-strings.c:596
 msgid "finishings.14"
 msgstr ""
 
 #. TRANSLATORS: Coat
-#: locale/ipp-strings.c:600
+#: locale/ipp-strings.c:598
 msgid "finishings.15"
 msgstr ""
 
 #. TRANSLATORS: Laminate
-#: locale/ipp-strings.c:602
+#: locale/ipp-strings.c:600
 msgid "finishings.16"
 msgstr ""
 
 #. TRANSLATORS: Staple Top Left
-#: locale/ipp-strings.c:604
+#: locale/ipp-strings.c:602
 msgid "finishings.20"
 msgstr ""
 
 #. TRANSLATORS: Staple Bottom Left
-#: locale/ipp-strings.c:606
+#: locale/ipp-strings.c:604
 msgid "finishings.21"
 msgstr ""
 
 #. TRANSLATORS: Staple Top Right
-#: locale/ipp-strings.c:608
+#: locale/ipp-strings.c:606
 msgid "finishings.22"
 msgstr ""
 
 #. TRANSLATORS: Staple Bottom Right
-#: locale/ipp-strings.c:610
+#: locale/ipp-strings.c:608
 msgid "finishings.23"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch Left
-#: locale/ipp-strings.c:612
+#: locale/ipp-strings.c:610
 msgid "finishings.24"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch Top
-#: locale/ipp-strings.c:614
+#: locale/ipp-strings.c:612
 msgid "finishings.25"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch Right
-#: locale/ipp-strings.c:616
+#: locale/ipp-strings.c:614
 msgid "finishings.26"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch Bottom
-#: locale/ipp-strings.c:618
+#: locale/ipp-strings.c:616
 msgid "finishings.27"
 msgstr ""
 
 #. TRANSLATORS: 2 Staples on Left
-#: locale/ipp-strings.c:620
+#: locale/ipp-strings.c:618
 msgid "finishings.28"
 msgstr ""
 
 #. TRANSLATORS: 2 Staples on Top
-#: locale/ipp-strings.c:622
+#: locale/ipp-strings.c:620
 msgid "finishings.29"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:624
+#: locale/ipp-strings.c:622
 msgid "finishings.3"
 msgstr ""
 
 #. TRANSLATORS: 2 Staples on Right
-#: locale/ipp-strings.c:626
+#: locale/ipp-strings.c:624
 msgid "finishings.30"
 msgstr ""
 
 #. TRANSLATORS: 2 Staples on Bottom
-#: locale/ipp-strings.c:628
+#: locale/ipp-strings.c:626
 msgid "finishings.31"
 msgstr ""
 
 #. TRANSLATORS: 3 Staples on Left
-#: locale/ipp-strings.c:630
+#: locale/ipp-strings.c:628
 msgid "finishings.32"
 msgstr ""
 
 #. TRANSLATORS: 3 Staples on Top
-#: locale/ipp-strings.c:632
+#: locale/ipp-strings.c:630
 msgid "finishings.33"
 msgstr ""
 
 #. TRANSLATORS: 3 Staples on Right
-#: locale/ipp-strings.c:634
+#: locale/ipp-strings.c:632
 msgid "finishings.34"
 msgstr ""
 
 #. TRANSLATORS: 3 Staples on Bottom
-#: locale/ipp-strings.c:636
+#: locale/ipp-strings.c:634
 msgid "finishings.35"
 msgstr ""
 
 #. TRANSLATORS: Staple
-#: locale/ipp-strings.c:638
+#: locale/ipp-strings.c:636
 msgid "finishings.4"
 msgstr ""
 
 #. TRANSLATORS: Punch
-#: locale/ipp-strings.c:640
+#: locale/ipp-strings.c:638
 msgid "finishings.5"
 msgstr ""
 
 #. TRANSLATORS: Bind Left
-#: locale/ipp-strings.c:642
+#: locale/ipp-strings.c:640
 msgid "finishings.50"
 msgstr ""
 
 #. TRANSLATORS: Bind Top
-#: locale/ipp-strings.c:644
+#: locale/ipp-strings.c:642
 msgid "finishings.51"
 msgstr ""
 
 #. TRANSLATORS: Bind Right
-#: locale/ipp-strings.c:646
+#: locale/ipp-strings.c:644
 msgid "finishings.52"
 msgstr ""
 
 #. TRANSLATORS: Bind Bottom
-#: locale/ipp-strings.c:648
+#: locale/ipp-strings.c:646
 msgid "finishings.53"
 msgstr ""
 
 #. TRANSLATORS: Cover
-#: locale/ipp-strings.c:650
+#: locale/ipp-strings.c:648
 msgid "finishings.6"
 msgstr ""
 
 #. TRANSLATORS: Trim Pages
-#: locale/ipp-strings.c:652
+#: locale/ipp-strings.c:650
 msgid "finishings.60"
 msgstr ""
 
 #. TRANSLATORS: Trim Documents
-#: locale/ipp-strings.c:654
+#: locale/ipp-strings.c:652
 msgid "finishings.61"
 msgstr ""
 
 #. TRANSLATORS: Trim Copies
-#: locale/ipp-strings.c:656
+#: locale/ipp-strings.c:654
 msgid "finishings.62"
 msgstr ""
 
 #. TRANSLATORS: Trim Job
-#: locale/ipp-strings.c:658
+#: locale/ipp-strings.c:656
 msgid "finishings.63"
 msgstr ""
 
 #. TRANSLATORS: Bind
-#: locale/ipp-strings.c:660
+#: locale/ipp-strings.c:658
 msgid "finishings.7"
 msgstr ""
 
 #. TRANSLATORS: Punch Top Left
-#: locale/ipp-strings.c:662
+#: locale/ipp-strings.c:660
 msgid "finishings.70"
 msgstr ""
 
 #. TRANSLATORS: Punch Bottom Left
-#: locale/ipp-strings.c:664
+#: locale/ipp-strings.c:662
 msgid "finishings.71"
 msgstr ""
 
 #. TRANSLATORS: Punch Top Right
-#: locale/ipp-strings.c:666
+#: locale/ipp-strings.c:664
 msgid "finishings.72"
 msgstr ""
 
 #. TRANSLATORS: Punch Bottom Right
-#: locale/ipp-strings.c:668
+#: locale/ipp-strings.c:666
 msgid "finishings.73"
 msgstr ""
 
 #. TRANSLATORS: 2-hole Punch Left
-#: locale/ipp-strings.c:670
+#: locale/ipp-strings.c:668
 msgid "finishings.74"
 msgstr ""
 
 #. TRANSLATORS: 2-hole Punch Top
-#: locale/ipp-strings.c:672
+#: locale/ipp-strings.c:670
 msgid "finishings.75"
 msgstr ""
 
 #. TRANSLATORS: 2-hole Punch Right
-#: locale/ipp-strings.c:674
+#: locale/ipp-strings.c:672
 msgid "finishings.76"
 msgstr ""
 
 #. TRANSLATORS: 2-hole Punch Bottom
-#: locale/ipp-strings.c:676
+#: locale/ipp-strings.c:674
 msgid "finishings.77"
 msgstr ""
 
 #. TRANSLATORS: 3-hole Punch Left
-#: locale/ipp-strings.c:678
+#: locale/ipp-strings.c:676
 msgid "finishings.78"
 msgstr ""
 
 #. TRANSLATORS: 3-hole Punch Top
-#: locale/ipp-strings.c:680
+#: locale/ipp-strings.c:678
 msgid "finishings.79"
 msgstr ""
 
 #. TRANSLATORS: Saddle Stitch
-#: locale/ipp-strings.c:682
+#: locale/ipp-strings.c:680
 msgid "finishings.8"
 msgstr ""
 
 #. TRANSLATORS: 3-hole Punch Right
-#: locale/ipp-strings.c:684
+#: locale/ipp-strings.c:682
 msgid "finishings.80"
 msgstr ""
 
 #. TRANSLATORS: 3-hole Punch Bottom
-#: locale/ipp-strings.c:686
+#: locale/ipp-strings.c:684
 msgid "finishings.81"
 msgstr ""
 
 #. TRANSLATORS: 4-hole Punch Left
-#: locale/ipp-strings.c:688
+#: locale/ipp-strings.c:686
 msgid "finishings.82"
 msgstr ""
 
 #. TRANSLATORS: 4-hole Punch Top
-#: locale/ipp-strings.c:690
+#: locale/ipp-strings.c:688
 msgid "finishings.83"
 msgstr ""
 
 #. TRANSLATORS: 4-hole Punch Right
-#: locale/ipp-strings.c:692
+#: locale/ipp-strings.c:690
 msgid "finishings.84"
 msgstr ""
 
 #. TRANSLATORS: 4-hole Punch Bottom
-#: locale/ipp-strings.c:694
+#: locale/ipp-strings.c:692
 msgid "finishings.85"
 msgstr ""
 
 #. TRANSLATORS: Multi-hole Punch Left
-#: locale/ipp-strings.c:696
+#: locale/ipp-strings.c:694
 msgid "finishings.86"
 msgstr ""
 
 #. TRANSLATORS: Multi-hole Punch Top
-#: locale/ipp-strings.c:698
+#: locale/ipp-strings.c:696
 msgid "finishings.87"
 msgstr ""
 
 #. TRANSLATORS: Multi-hole Punch Right
-#: locale/ipp-strings.c:700
+#: locale/ipp-strings.c:698
 msgid "finishings.88"
 msgstr ""
 
 #. TRANSLATORS: Multi-hole Punch Bottom
-#: locale/ipp-strings.c:702
+#: locale/ipp-strings.c:700
 msgid "finishings.89"
 msgstr ""
 
 #. TRANSLATORS: Edge Stitch
-#: locale/ipp-strings.c:704
+#: locale/ipp-strings.c:702
 msgid "finishings.9"
 msgstr ""
 
 #. TRANSLATORS: Accordion Fold
-#: locale/ipp-strings.c:706
+#: locale/ipp-strings.c:704
 msgid "finishings.90"
 msgstr ""
 
 #. TRANSLATORS: Double Gate Fold
-#: locale/ipp-strings.c:708
+#: locale/ipp-strings.c:706
 msgid "finishings.91"
 msgstr ""
 
 #. TRANSLATORS: Gate Fold
-#: locale/ipp-strings.c:710
+#: locale/ipp-strings.c:708
 msgid "finishings.92"
 msgstr ""
 
 #. TRANSLATORS: Half Fold
-#: locale/ipp-strings.c:712
+#: locale/ipp-strings.c:710
 msgid "finishings.93"
 msgstr ""
 
 #. TRANSLATORS: Half Z Fold
-#: locale/ipp-strings.c:714
+#: locale/ipp-strings.c:712
 msgid "finishings.94"
 msgstr ""
 
 #. TRANSLATORS: Left Gate Fold
-#: locale/ipp-strings.c:716
+#: locale/ipp-strings.c:714
 msgid "finishings.95"
 msgstr ""
 
 #. TRANSLATORS: Letter Fold
-#: locale/ipp-strings.c:718
+#: locale/ipp-strings.c:716
 msgid "finishings.96"
 msgstr ""
 
 #. TRANSLATORS: Parallel Fold
-#: locale/ipp-strings.c:720
+#: locale/ipp-strings.c:718
 msgid "finishings.97"
 msgstr ""
 
 #. TRANSLATORS: Poster Fold
-#: locale/ipp-strings.c:722
+#: locale/ipp-strings.c:720
 msgid "finishings.98"
 msgstr ""
 
 #. TRANSLATORS: Right Gate Fold
-#: locale/ipp-strings.c:724
+#: locale/ipp-strings.c:722
 msgid "finishings.99"
 msgstr ""
 
 #. TRANSLATORS: Fold
-#: locale/ipp-strings.c:726
+#: locale/ipp-strings.c:724
 msgid "folding"
 msgstr ""
 
 #. TRANSLATORS: Fold Direction
-#: locale/ipp-strings.c:728
+#: locale/ipp-strings.c:726
 msgid "folding-direction"
 msgstr ""
 
 #. TRANSLATORS: Inward
-#: locale/ipp-strings.c:730
+#: locale/ipp-strings.c:728
 msgid "folding-direction.inward"
 msgstr ""
 
 #. TRANSLATORS: Outward
-#: locale/ipp-strings.c:732
+#: locale/ipp-strings.c:730
 msgid "folding-direction.outward"
 msgstr ""
 
 #. TRANSLATORS: Fold Position
-#: locale/ipp-strings.c:734
+#: locale/ipp-strings.c:732
 msgid "folding-offset"
 msgstr ""
 
 #. TRANSLATORS: Fold Edge
-#: locale/ipp-strings.c:736
+#: locale/ipp-strings.c:734
 msgid "folding-reference-edge"
 msgstr ""
 
 #. TRANSLATORS: Bottom
-#: locale/ipp-strings.c:738
+#: locale/ipp-strings.c:736
 msgid "folding-reference-edge.bottom"
 msgstr ""
 
 #. TRANSLATORS: Left
-#: locale/ipp-strings.c:740
+#: locale/ipp-strings.c:738
 msgid "folding-reference-edge.left"
 msgstr ""
 
 #. TRANSLATORS: Right
-#: locale/ipp-strings.c:742
+#: locale/ipp-strings.c:740
 msgid "folding-reference-edge.right"
 msgstr ""
 
 #. TRANSLATORS: Top
-#: locale/ipp-strings.c:744
+#: locale/ipp-strings.c:742
 msgid "folding-reference-edge.top"
 msgstr ""
 
 #. TRANSLATORS: Font Name
-#: locale/ipp-strings.c:746
+#: locale/ipp-strings.c:744
 msgid "font-name-requested"
 msgstr ""
 
 #. TRANSLATORS: Font Size
-#: locale/ipp-strings.c:748
+#: locale/ipp-strings.c:746
 msgid "font-size-requested"
 msgstr ""
 
 #. TRANSLATORS: Force Front Side
-#: locale/ipp-strings.c:750
+#: locale/ipp-strings.c:748
 msgid "force-front-side"
 msgstr ""
 
 #. TRANSLATORS: From Name
-#: locale/ipp-strings.c:752
+#: locale/ipp-strings.c:750
 msgid "from-name"
 msgstr ""
 
@@ -8736,267 +8735,32 @@ msgid "idle"
 msgstr ""
 
 #. TRANSLATORS: Imposition Template
-#: locale/ipp-strings.c:754
+#: locale/ipp-strings.c:752
 msgid "imposition-template"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:756
+#: locale/ipp-strings.c:754
 msgid "imposition-template.none"
 msgstr ""
 
 #. TRANSLATORS: Signature
-#: locale/ipp-strings.c:758
+#: locale/ipp-strings.c:756
 msgid "imposition-template.signature"
 msgstr ""
 
-#. TRANSLATORS: Scanner Options
-#: locale/ipp-strings.c:760
-msgid "input-attributes"
-msgstr ""
-
-#. TRANSLATORS: Scan Auto Scaling
-#: locale/ipp-strings.c:762
-msgid "input-auto-scaling"
-msgstr ""
-
-#. TRANSLATORS: Scan Auto Skew Correction
-#: locale/ipp-strings.c:764
-msgid "input-auto-skew-correction"
-msgstr ""
-
-#. TRANSLATORS: Scan Brightness
-#: locale/ipp-strings.c:766
-msgid "input-brightness"
-msgstr ""
-
-#. TRANSLATORS: Scanning Mode
-#: locale/ipp-strings.c:768
-msgid "input-color-mode"
-msgstr ""
-
-#. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:770
-msgid "input-color-mode.auto"
-msgstr ""
-
-#. TRANSLATORS: Text
-#: locale/ipp-strings.c:772
-msgid "input-color-mode.bi-level"
-msgstr ""
-
-#. TRANSLATORS: 16-bit CMYK
-#: locale/ipp-strings.c:774
-msgid "input-color-mode.cmyk_16"
-msgstr ""
-
-#. TRANSLATORS: 8-bit CMYK
-#: locale/ipp-strings.c:776
-msgid "input-color-mode.cmyk_8"
-msgstr ""
-
-#. TRANSLATORS: Color
-#: locale/ipp-strings.c:778
-msgid "input-color-mode.color"
-msgstr ""
-
-#. TRANSLATORS: 8-bit Color
-#: locale/ipp-strings.c:780
-msgid "input-color-mode.color_8"
-msgstr ""
-
-#. TRANSLATORS: Monochrome
-#: locale/ipp-strings.c:782
-msgid "input-color-mode.monochrome"
-msgstr ""
-
-#. TRANSLATORS: 16-bit Monochrome
-#: locale/ipp-strings.c:784
-msgid "input-color-mode.monochrome_16"
-msgstr ""
-
-#. TRANSLATORS: 4-bit Monochrome
-#: locale/ipp-strings.c:786
-msgid "input-color-mode.monochrome_4"
-msgstr ""
-
-#. TRANSLATORS: 8-bit Monochrome
-#: locale/ipp-strings.c:788
-msgid "input-color-mode.monochrome_8"
-msgstr ""
-
-#. TRANSLATORS: 16-bit RGB
-#: locale/ipp-strings.c:790
-msgid "input-color-mode.rgb_16"
-msgstr ""
-
-#. TRANSLATORS: 16-bit RGBA
-#: locale/ipp-strings.c:792
-msgid "input-color-mode.rgba_16"
-msgstr ""
-
-#. TRANSLATORS: 8-bit RGBA
-#: locale/ipp-strings.c:794
-msgid "input-color-mode.rgba_8"
-msgstr ""
-
-#. TRANSLATORS: Scan Content
-#: locale/ipp-strings.c:796
-msgid "input-content-type"
-msgstr ""
-
-#. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:798
-msgid "input-content-type.auto"
-msgstr ""
-
-#. TRANSLATORS: Halftone
-#: locale/ipp-strings.c:800
-msgid "input-content-type.halftone"
-msgstr ""
-
-#. TRANSLATORS: Line Art
-#: locale/ipp-strings.c:802
-msgid "input-content-type.line-art"
-msgstr ""
-
-#. TRANSLATORS: Magazine
-#: locale/ipp-strings.c:804
-msgid "input-content-type.magazine"
-msgstr ""
-
-#. TRANSLATORS: Photo
-#: locale/ipp-strings.c:806
-msgid "input-content-type.photo"
-msgstr ""
-
-#. TRANSLATORS: Text
-#: locale/ipp-strings.c:808
-msgid "input-content-type.text"
-msgstr ""
-
-#. TRANSLATORS: Text And Photo
-#: locale/ipp-strings.c:810
-msgid "input-content-type.text-and-photo"
-msgstr ""
-
-#. TRANSLATORS: Scan Contrast
-#: locale/ipp-strings.c:812
-msgid "input-contrast"
-msgstr ""
-
-#. TRANSLATORS: Film Type
-#: locale/ipp-strings.c:814
-msgid "input-film-scan-mode"
-msgstr ""
-
-#. TRANSLATORS: Black And White Negative Film
-#: locale/ipp-strings.c:816
-msgid "input-film-scan-mode.black-and-white-negative-film"
-msgstr ""
-
-#. TRANSLATORS: Color Negative Film
-#: locale/ipp-strings.c:818
-msgid "input-film-scan-mode.color-negative-film"
-msgstr ""
-
-#. TRANSLATORS: Color Slide Film
-#: locale/ipp-strings.c:820
-msgid "input-film-scan-mode.color-slide-film"
-msgstr ""
-
-#. TRANSLATORS: Not Applicable
-#: locale/ipp-strings.c:822
-msgid "input-film-scan-mode.not-applicable"
-msgstr ""
-
-#. TRANSLATORS: Scan Images To Transfer
-#: locale/ipp-strings.c:824
-msgid "input-images-to-transfer"
-msgstr ""
-
-#. TRANSLATORS: Scan Media
-#: locale/ipp-strings.c:826
-msgid "input-media"
-msgstr ""
-
-#. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:828
-msgid "input-media.auto"
-msgstr ""
-
-#. TRANSLATORS: Scan Orientation
-#: locale/ipp-strings.c:830
-msgid "input-orientation-requested"
-msgstr ""
-
-#. TRANSLATORS: Scan Quality
-#: locale/ipp-strings.c:832
-msgid "input-quality"
-msgstr ""
-
-#. TRANSLATORS: Scan Resolution
-#: locale/ipp-strings.c:834
-msgid "input-resolution"
-msgstr ""
-
-#. TRANSLATORS: Scan Scaling Height
-#: locale/ipp-strings.c:836
-msgid "input-scaling-height"
-msgstr ""
-
-#. TRANSLATORS: Scan Scaling Width
-#: locale/ipp-strings.c:838
-msgid "input-scaling-width"
-msgstr ""
-
-#. TRANSLATORS: Scan Regions
-#: locale/ipp-strings.c:840
-msgid "input-scan-regions"
-msgstr ""
-
-#. TRANSLATORS: Scan Sharpness
-#: locale/ipp-strings.c:842
-msgid "input-sharpness"
-msgstr ""
-
-#. TRANSLATORS: 2-Sided Scanning
-#: locale/ipp-strings.c:844
-msgid "input-sides"
-msgstr ""
-
-#. TRANSLATORS: Scan Source
-#: locale/ipp-strings.c:846
-msgid "input-source"
-msgstr ""
-
-#. TRANSLATORS: Automatic Document Feeder
-#: locale/ipp-strings.c:848
-msgid "input-source.adf"
-msgstr ""
-
-#. TRANSLATORS: Film Reader
-#: locale/ipp-strings.c:850
-msgid "input-source.film-reader"
-msgstr ""
-
-#. TRANSLATORS: Platen
-#: locale/ipp-strings.c:852
-msgid "input-source.platen"
-msgstr ""
-
 #. TRANSLATORS: Insert Page Number
-#: locale/ipp-strings.c:854
+#: locale/ipp-strings.c:758
 msgid "insert-after-page-number"
 msgstr ""
 
 #. TRANSLATORS: Insert Count
-#: locale/ipp-strings.c:856
+#: locale/ipp-strings.c:760
 msgid "insert-count"
 msgstr ""
 
 #. TRANSLATORS: Insert Sheet
-#: locale/ipp-strings.c:858
+#: locale/ipp-strings.c:762
 msgid "insert-sheet"
 msgstr ""
 
@@ -9156,876 +8920,896 @@ msgid "ipptool: URI required before test file."
 msgstr ""
 
 #. TRANSLATORS: Job Account ID
-#: locale/ipp-strings.c:860
+#: locale/ipp-strings.c:764
 msgid "job-account-id"
 msgstr ""
 
 #. TRANSLATORS: Job Account Type
-#: locale/ipp-strings.c:862
+#: locale/ipp-strings.c:766
 msgid "job-account-type"
 msgstr ""
 
 #. TRANSLATORS: General
-#: locale/ipp-strings.c:864
+#: locale/ipp-strings.c:768
 msgid "job-account-type.general"
 msgstr ""
 
 #. TRANSLATORS: Group
-#: locale/ipp-strings.c:866
+#: locale/ipp-strings.c:770
 msgid "job-account-type.group"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:868
+#: locale/ipp-strings.c:772
 msgid "job-account-type.none"
 msgstr ""
 
 #. TRANSLATORS: Job Accounting Output Bin
-#: locale/ipp-strings.c:870
+#: locale/ipp-strings.c:774
 msgid "job-accounting-output-bin"
 msgstr ""
 
 #. TRANSLATORS: Job Accounting Sheets
-#: locale/ipp-strings.c:872
+#: locale/ipp-strings.c:776
 msgid "job-accounting-sheets"
 msgstr ""
 
 #. TRANSLATORS: Type of Job Accounting Sheets
-#: locale/ipp-strings.c:874
+#: locale/ipp-strings.c:778
 msgid "job-accounting-sheets-type"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:876
+#: locale/ipp-strings.c:780
 msgid "job-accounting-sheets-type.none"
 msgstr ""
 
 #. TRANSLATORS: Standard
-#: locale/ipp-strings.c:878
+#: locale/ipp-strings.c:782
 msgid "job-accounting-sheets-type.standard"
 msgstr ""
 
 #. TRANSLATORS: Job Accounting User ID
-#: locale/ipp-strings.c:880
+#: locale/ipp-strings.c:784
 msgid "job-accounting-user-id"
 msgstr ""
 
-#. TRANSLATORS: Collate Copies
-#: locale/ipp-strings.c:882
-msgid "job-collation-type"
-msgstr ""
-
-#. TRANSLATORS: Uncollated Sheets
-#: locale/ipp-strings.c:884
-msgid "job-collation-type.3"
-msgstr ""
-
-#. TRANSLATORS: Collated Documents
-#: locale/ipp-strings.c:886
-msgid "job-collation-type.4"
-msgstr ""
-
-#. TRANSLATORS: Uncollated Documents
-#: locale/ipp-strings.c:888
-msgid "job-collation-type.5"
+#. TRANSLATORS: Job Cancel After
+#: locale/ipp-strings.c:786
+msgid "job-cancel-after"
 msgstr ""
 
 #. TRANSLATORS: Copies
-#: locale/ipp-strings.c:890
+#: locale/ipp-strings.c:788
 msgid "job-copies"
 msgstr ""
 
 #. TRANSLATORS: Back Cover
-#: locale/ipp-strings.c:892
+#: locale/ipp-strings.c:790
 msgid "job-cover-back"
 msgstr ""
 
 #. TRANSLATORS: Front Cover
-#: locale/ipp-strings.c:894
+#: locale/ipp-strings.c:792
 msgid "job-cover-front"
 msgstr ""
 
 #. TRANSLATORS: Delay Output Until
-#: locale/ipp-strings.c:896
+#: locale/ipp-strings.c:794
 msgid "job-delay-output-until"
 msgstr ""
 
 #. TRANSLATORS: Delay Output Until
-#: locale/ipp-strings.c:898
+#: locale/ipp-strings.c:796
 msgid "job-delay-output-until-time"
 msgstr ""
 
 #. TRANSLATORS: Daytime
-#: locale/ipp-strings.c:900
+#: locale/ipp-strings.c:798
 msgid "job-delay-output-until.day-time"
 msgstr ""
 
 #. TRANSLATORS: Evening
-#: locale/ipp-strings.c:902
+#: locale/ipp-strings.c:800
 msgid "job-delay-output-until.evening"
 msgstr ""
 
 #. TRANSLATORS: Released
-#: locale/ipp-strings.c:904
+#: locale/ipp-strings.c:802
 msgid "job-delay-output-until.indefinite"
 msgstr ""
 
 #. TRANSLATORS: Night
-#: locale/ipp-strings.c:906
+#: locale/ipp-strings.c:804
 msgid "job-delay-output-until.night"
 msgstr ""
 
 #. TRANSLATORS: No Delay
-#: locale/ipp-strings.c:908
+#: locale/ipp-strings.c:806
 msgid "job-delay-output-until.no-delay-output"
 msgstr ""
 
 #. TRANSLATORS: Second Shift
-#: locale/ipp-strings.c:910
+#: locale/ipp-strings.c:808
 msgid "job-delay-output-until.second-shift"
 msgstr ""
 
 #. TRANSLATORS: Third Shift
-#: locale/ipp-strings.c:912
+#: locale/ipp-strings.c:810
 msgid "job-delay-output-until.third-shift"
 msgstr ""
 
 #. TRANSLATORS: Weekend
-#: locale/ipp-strings.c:914
+#: locale/ipp-strings.c:812
 msgid "job-delay-output-until.weekend"
 msgstr ""
 
 #. TRANSLATORS: On Error
-#: locale/ipp-strings.c:916
+#: locale/ipp-strings.c:814
 msgid "job-error-action"
 msgstr ""
 
 #. TRANSLATORS: Abort Job
-#: locale/ipp-strings.c:918
+#: locale/ipp-strings.c:816
 msgid "job-error-action.abort-job"
 msgstr ""
 
 #. TRANSLATORS: Cancel Job
-#: locale/ipp-strings.c:920
+#: locale/ipp-strings.c:818
 msgid "job-error-action.cancel-job"
 msgstr ""
 
 #. TRANSLATORS: Continue Job
-#: locale/ipp-strings.c:922
+#: locale/ipp-strings.c:820
 msgid "job-error-action.continue-job"
 msgstr ""
 
 #. TRANSLATORS: Suspend Job
-#: locale/ipp-strings.c:924
+#: locale/ipp-strings.c:822
 msgid "job-error-action.suspend-job"
 msgstr ""
 
 #. TRANSLATORS: Print Error Sheet
-#: locale/ipp-strings.c:926
+#: locale/ipp-strings.c:824
 msgid "job-error-sheet"
 msgstr ""
 
 #. TRANSLATORS: Type of Error Sheet
-#: locale/ipp-strings.c:928
+#: locale/ipp-strings.c:826
 msgid "job-error-sheet-type"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:930
+#: locale/ipp-strings.c:828
 msgid "job-error-sheet-type.none"
 msgstr ""
 
 #. TRANSLATORS: Standard
-#: locale/ipp-strings.c:932
+#: locale/ipp-strings.c:830
 msgid "job-error-sheet-type.standard"
 msgstr ""
 
 #. TRANSLATORS: Print Error Sheet
-#: locale/ipp-strings.c:934
+#: locale/ipp-strings.c:832
 msgid "job-error-sheet-when"
 msgstr ""
 
 #. TRANSLATORS: Always
-#: locale/ipp-strings.c:936
+#: locale/ipp-strings.c:834
 msgid "job-error-sheet-when.always"
 msgstr ""
 
 #. TRANSLATORS: On Error
-#: locale/ipp-strings.c:938
+#: locale/ipp-strings.c:836
 msgid "job-error-sheet-when.on-error"
 msgstr ""
 
 #. TRANSLATORS: Job Finishings
-#: locale/ipp-strings.c:940
+#: locale/ipp-strings.c:838
 msgid "job-finishings"
 msgstr ""
 
 #. TRANSLATORS: Hold Until
-#: locale/ipp-strings.c:942
+#: locale/ipp-strings.c:840
 msgid "job-hold-until"
 msgstr ""
 
 #. TRANSLATORS: Hold Until
-#: locale/ipp-strings.c:944
+#: locale/ipp-strings.c:842
 msgid "job-hold-until-time"
 msgstr ""
 
 #. TRANSLATORS: Daytime
-#: locale/ipp-strings.c:946
+#: locale/ipp-strings.c:844
 msgid "job-hold-until.day-time"
 msgstr ""
 
 #. TRANSLATORS: Evening
-#: locale/ipp-strings.c:948
+#: locale/ipp-strings.c:846
 msgid "job-hold-until.evening"
 msgstr ""
 
 #. TRANSLATORS: Released
-#: locale/ipp-strings.c:950
+#: locale/ipp-strings.c:848
 msgid "job-hold-until.indefinite"
 msgstr ""
 
 #. TRANSLATORS: Night
-#: locale/ipp-strings.c:952
+#: locale/ipp-strings.c:850
 msgid "job-hold-until.night"
 msgstr ""
 
 #. TRANSLATORS: No Hold
-#: locale/ipp-strings.c:954
+#: locale/ipp-strings.c:852
 msgid "job-hold-until.no-hold"
 msgstr ""
 
 #. TRANSLATORS: Second Shift
-#: locale/ipp-strings.c:956
+#: locale/ipp-strings.c:854
 msgid "job-hold-until.second-shift"
 msgstr ""
 
 #. TRANSLATORS: Third Shift
-#: locale/ipp-strings.c:958
+#: locale/ipp-strings.c:856
 msgid "job-hold-until.third-shift"
 msgstr ""
 
 #. TRANSLATORS: Weekend
-#: locale/ipp-strings.c:960
+#: locale/ipp-strings.c:858
 msgid "job-hold-until.weekend"
 msgstr ""
 
 #. TRANSLATORS: Job Mandatory Attributes
-#: locale/ipp-strings.c:962
+#: locale/ipp-strings.c:860
 msgid "job-mandatory-attributes"
 msgstr ""
 
 #. TRANSLATORS: Title
-#: locale/ipp-strings.c:964
+#: locale/ipp-strings.c:862
 msgid "job-name"
 msgstr ""
 
 #. TRANSLATORS: Job Pages
-#: locale/ipp-strings.c:966
+#: locale/ipp-strings.c:864
 msgid "job-pages"
 msgstr ""
 
 #. TRANSLATORS: Job Pages
-#: locale/ipp-strings.c:968
+#: locale/ipp-strings.c:866
 msgid "job-pages-col"
 msgstr ""
 
 #. TRANSLATORS: Job Phone Number
-#: locale/ipp-strings.c:970
+#: locale/ipp-strings.c:868
 msgid "job-phone-number"
 msgstr ""
 
-#: scheduler/ipp.c:8100
+#: scheduler/ipp.c:8095
 msgid "job-printer-uri attribute missing."
 msgstr ""
 
 #. TRANSLATORS: Job Priority
-#: locale/ipp-strings.c:972
+#: locale/ipp-strings.c:870
 msgid "job-priority"
 msgstr ""
 
 #. TRANSLATORS: Job Privacy Attributes
-#: locale/ipp-strings.c:974
+#: locale/ipp-strings.c:872
 msgid "job-privacy-attributes"
 msgstr ""
 
 #. TRANSLATORS: All
-#: locale/ipp-strings.c:976
+#: locale/ipp-strings.c:874
 msgid "job-privacy-attributes.all"
 msgstr ""
 
 #. TRANSLATORS: Default
-#: locale/ipp-strings.c:978
+#: locale/ipp-strings.c:876
 msgid "job-privacy-attributes.default"
 msgstr ""
 
 #. TRANSLATORS: Job Description
-#: locale/ipp-strings.c:980
+#: locale/ipp-strings.c:878
 msgid "job-privacy-attributes.job-description"
 msgstr ""
 
 #. TRANSLATORS: Job Template
-#: locale/ipp-strings.c:982
+#: locale/ipp-strings.c:880
 msgid "job-privacy-attributes.job-template"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:984
+#: locale/ipp-strings.c:882
 msgid "job-privacy-attributes.none"
 msgstr ""
 
 #. TRANSLATORS: Job Privacy Scope
-#: locale/ipp-strings.c:986
+#: locale/ipp-strings.c:884
 msgid "job-privacy-scope"
 msgstr ""
 
 #. TRANSLATORS: All
-#: locale/ipp-strings.c:988
+#: locale/ipp-strings.c:886
 msgid "job-privacy-scope.all"
 msgstr ""
 
 #. TRANSLATORS: Default
-#: locale/ipp-strings.c:990
+#: locale/ipp-strings.c:888
 msgid "job-privacy-scope.default"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:992
+#: locale/ipp-strings.c:890
 msgid "job-privacy-scope.none"
 msgstr ""
 
 #. TRANSLATORS: Owner
-#: locale/ipp-strings.c:994
+#: locale/ipp-strings.c:892
 msgid "job-privacy-scope.owner"
 msgstr ""
 
 #. TRANSLATORS: Job Recipient Name
-#: locale/ipp-strings.c:996
+#: locale/ipp-strings.c:894
 msgid "job-recipient-name"
 msgstr ""
 
-#. TRANSLATORS: Job Resource Ids
-#: locale/ipp-strings.c:998
-msgid "job-resource-ids"
+#. TRANSLATORS: Job Retain Until
+#: locale/ipp-strings.c:896
+msgid "job-retain-until"
+msgstr ""
+
+#. TRANSLATORS: Job Retain Until Interval
+#: locale/ipp-strings.c:898
+msgid "job-retain-until-interval"
+msgstr ""
+
+#. TRANSLATORS: Job Retain Until Time
+#: locale/ipp-strings.c:900
+msgid "job-retain-until-time"
+msgstr ""
+
+#. TRANSLATORS: End Of Day
+#: locale/ipp-strings.c:902
+msgid "job-retain-until.end-of-day"
+msgstr ""
+
+#. TRANSLATORS: End Of Month
+#: locale/ipp-strings.c:904
+msgid "job-retain-until.end-of-month"
+msgstr ""
+
+#. TRANSLATORS: End Of Week
+#: locale/ipp-strings.c:906
+msgid "job-retain-until.end-of-week"
+msgstr ""
+
+#. TRANSLATORS: Indefinite
+#: locale/ipp-strings.c:908
+msgid "job-retain-until.indefinite"
+msgstr ""
+
+#. TRANSLATORS: None
+#: locale/ipp-strings.c:910
+msgid "job-retain-until.none"
 msgstr ""
 
 #. TRANSLATORS: Job Save Disposition
-#: locale/ipp-strings.c:1000
+#: locale/ipp-strings.c:912
 msgid "job-save-disposition"
 msgstr ""
 
 #. TRANSLATORS: Job Sheet Message
-#: locale/ipp-strings.c:1002
+#: locale/ipp-strings.c:914
 msgid "job-sheet-message"
 msgstr ""
 
 #. TRANSLATORS: Banner Page
-#: locale/ipp-strings.c:1004
+#: locale/ipp-strings.c:916
 msgid "job-sheets"
 msgstr ""
 
 #. TRANSLATORS: Banner Page
-#: locale/ipp-strings.c:1006
+#: locale/ipp-strings.c:918
 msgid "job-sheets-col"
 msgstr ""
 
 #. TRANSLATORS: First Page in Document
-#: locale/ipp-strings.c:1008
+#: locale/ipp-strings.c:920
 msgid "job-sheets.first-print-stream-page"
 msgstr ""
 
 #. TRANSLATORS: Start and End Sheets
-#: locale/ipp-strings.c:1010
+#: locale/ipp-strings.c:922
 msgid "job-sheets.job-both-sheet"
 msgstr ""
 
 #. TRANSLATORS: End Sheet
-#: locale/ipp-strings.c:1012
+#: locale/ipp-strings.c:924
 msgid "job-sheets.job-end-sheet"
 msgstr ""
 
 #. TRANSLATORS: Start Sheet
-#: locale/ipp-strings.c:1014
+#: locale/ipp-strings.c:926
 msgid "job-sheets.job-start-sheet"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:1016
+#: locale/ipp-strings.c:928
 msgid "job-sheets.none"
 msgstr ""
 
 #. TRANSLATORS: Standard
-#: locale/ipp-strings.c:1018
+#: locale/ipp-strings.c:930
 msgid "job-sheets.standard"
 msgstr ""
 
 #. TRANSLATORS: Job State
-#: locale/ipp-strings.c:1020
+#: locale/ipp-strings.c:932
 msgid "job-state"
 msgstr ""
 
 #. TRANSLATORS: Job State Message
-#: locale/ipp-strings.c:1022
+#: locale/ipp-strings.c:934
 msgid "job-state-message"
 msgstr ""
 
 #. TRANSLATORS: Detailed Job State
-#: locale/ipp-strings.c:1024
+#: locale/ipp-strings.c:936
 msgid "job-state-reasons"
 msgstr ""
 
-#. TRANSLATORS: Aborted By System
-#: locale/ipp-strings.c:1026
+#. TRANSLATORS: Stopping
+#: locale/ipp-strings.c:938
 msgid "job-state-reasons.aborted-by-system"
 msgstr ""
 
 #. TRANSLATORS: Account Authorization Failed
-#: locale/ipp-strings.c:1028
+#: locale/ipp-strings.c:940
 msgid "job-state-reasons.account-authorization-failed"
 msgstr ""
 
 #. TRANSLATORS: Account Closed
-#: locale/ipp-strings.c:1030
+#: locale/ipp-strings.c:942
 msgid "job-state-reasons.account-closed"
 msgstr ""
 
 #. TRANSLATORS: Account Info Needed
-#: locale/ipp-strings.c:1032
+#: locale/ipp-strings.c:944
 msgid "job-state-reasons.account-info-needed"
 msgstr ""
 
 #. TRANSLATORS: Account Limit Reached
-#: locale/ipp-strings.c:1034
+#: locale/ipp-strings.c:946
 msgid "job-state-reasons.account-limit-reached"
 msgstr ""
 
-#. TRANSLATORS: Compression Error
-#: locale/ipp-strings.c:1036
+#. TRANSLATORS: Decompression error
+#: locale/ipp-strings.c:948
 msgid "job-state-reasons.compression-error"
 msgstr ""
 
 #. TRANSLATORS: Conflicting Attributes
-#: locale/ipp-strings.c:1038
+#: locale/ipp-strings.c:950
 msgid "job-state-reasons.conflicting-attributes"
 msgstr ""
 
 #. TRANSLATORS: Connected To Destination
-#: locale/ipp-strings.c:1040
+#: locale/ipp-strings.c:952
 msgid "job-state-reasons.connected-to-destination"
 msgstr ""
 
 #. TRANSLATORS: Connecting To Destination
-#: locale/ipp-strings.c:1042
+#: locale/ipp-strings.c:954
 msgid "job-state-reasons.connecting-to-destination"
 msgstr ""
 
 #. TRANSLATORS: Destination Uri Failed
-#: locale/ipp-strings.c:1044
+#: locale/ipp-strings.c:956
 msgid "job-state-reasons.destination-uri-failed"
 msgstr ""
 
 #. TRANSLATORS: Digital Signature Did Not Verify
-#: locale/ipp-strings.c:1046
+#: locale/ipp-strings.c:958
 msgid "job-state-reasons.digital-signature-did-not-verify"
 msgstr ""
 
 #. TRANSLATORS: Digital Signature Type Not Supported
-#: locale/ipp-strings.c:1048
+#: locale/ipp-strings.c:960
 msgid "job-state-reasons.digital-signature-type-not-supported"
 msgstr ""
 
 #. TRANSLATORS: Document Access Error
-#: locale/ipp-strings.c:1050
+#: locale/ipp-strings.c:962
 msgid "job-state-reasons.document-access-error"
 msgstr ""
 
 #. TRANSLATORS: Document Format Error
-#: locale/ipp-strings.c:1052
+#: locale/ipp-strings.c:964
 msgid "job-state-reasons.document-format-error"
 msgstr ""
 
 #. TRANSLATORS: Document Password Error
-#: locale/ipp-strings.c:1054
+#: locale/ipp-strings.c:966
 msgid "job-state-reasons.document-password-error"
 msgstr ""
 
 #. TRANSLATORS: Document Permission Error
-#: locale/ipp-strings.c:1056
+#: locale/ipp-strings.c:968
 msgid "job-state-reasons.document-permission-error"
 msgstr ""
 
 #. TRANSLATORS: Document Security Error
-#: locale/ipp-strings.c:1058
+#: locale/ipp-strings.c:970
 msgid "job-state-reasons.document-security-error"
 msgstr ""
 
 #. TRANSLATORS: Document Unprintable Error
-#: locale/ipp-strings.c:1060
+#: locale/ipp-strings.c:972
 msgid "job-state-reasons.document-unprintable-error"
 msgstr ""
 
 #. TRANSLATORS: Errors Detected
-#: locale/ipp-strings.c:1062
+#: locale/ipp-strings.c:974
 msgid "job-state-reasons.errors-detected"
 msgstr ""
 
-#. TRANSLATORS: Job Canceled At Device
-#: locale/ipp-strings.c:1064
+#. TRANSLATORS: Canceled at printer
+#: locale/ipp-strings.c:976
 msgid "job-state-reasons.job-canceled-at-device"
 msgstr ""
 
-#. TRANSLATORS: Job Canceled By Operator
-#: locale/ipp-strings.c:1066
+#. TRANSLATORS: Canceled by operator
+#: locale/ipp-strings.c:978
 msgid "job-state-reasons.job-canceled-by-operator"
 msgstr ""
 
-#. TRANSLATORS: Job Canceled By User
-#: locale/ipp-strings.c:1068
+#. TRANSLATORS: Canceled by user
+#: locale/ipp-strings.c:980
 msgid "job-state-reasons.job-canceled-by-user"
 msgstr ""
 
-#. TRANSLATORS: Job Completed Successfully
-#: locale/ipp-strings.c:1070
+#. TRANSLATORS:
+#: locale/ipp-strings.c:982
 msgid "job-state-reasons.job-completed-successfully"
 msgstr ""
 
-#. TRANSLATORS: Job Completed With Errors
-#: locale/ipp-strings.c:1072
+#. TRANSLATORS: Completed with errors
+#: locale/ipp-strings.c:984
 msgid "job-state-reasons.job-completed-with-errors"
 msgstr ""
 
-#. TRANSLATORS: Job Completed With Warnings
-#: locale/ipp-strings.c:1074
+#. TRANSLATORS: Completed with warnings
+#: locale/ipp-strings.c:986
 msgid "job-state-reasons.job-completed-with-warnings"
 msgstr ""
 
-#. TRANSLATORS: Job Data Insufficient
-#: locale/ipp-strings.c:1076
+#. TRANSLATORS: Insufficient data
+#: locale/ipp-strings.c:988
 msgid "job-state-reasons.job-data-insufficient"
 msgstr ""
 
 #. TRANSLATORS: Job Delay Output Until Specified
-#: locale/ipp-strings.c:1078
+#: locale/ipp-strings.c:990
 msgid "job-state-reasons.job-delay-output-until-specified"
 msgstr ""
 
 #. TRANSLATORS: Job Digital Signature Wait
-#: locale/ipp-strings.c:1080
+#: locale/ipp-strings.c:992
 msgid "job-state-reasons.job-digital-signature-wait"
 msgstr ""
 
 #. TRANSLATORS: Job Fetchable
-#: locale/ipp-strings.c:1082
+#: locale/ipp-strings.c:994
 msgid "job-state-reasons.job-fetchable"
 msgstr ""
 
 #. TRANSLATORS: Job Held For Review
-#: locale/ipp-strings.c:1084
+#: locale/ipp-strings.c:996
 msgid "job-state-reasons.job-held-for-review"
 msgstr ""
 
-#. TRANSLATORS: Job Hold Until Specified
-#: locale/ipp-strings.c:1086
+#. TRANSLATORS: Job held
+#: locale/ipp-strings.c:998
 msgid "job-state-reasons.job-hold-until-specified"
 msgstr ""
 
-#. TRANSLATORS: Job Incoming
-#: locale/ipp-strings.c:1088
+#. TRANSLATORS: Incoming
+#: locale/ipp-strings.c:1000
 msgid "job-state-reasons.job-incoming"
 msgstr ""
 
-#. TRANSLATORS: Job Interpreting
-#: locale/ipp-strings.c:1090
+#. TRANSLATORS: Interpreting
+#: locale/ipp-strings.c:1002
 msgid "job-state-reasons.job-interpreting"
 msgstr ""
 
-#. TRANSLATORS: Job Outgoing
-#: locale/ipp-strings.c:1092
+#. TRANSLATORS: Outgoing
+#: locale/ipp-strings.c:1004
 msgid "job-state-reasons.job-outgoing"
 msgstr ""
 
 #. TRANSLATORS: Job Password Wait
-#: locale/ipp-strings.c:1094
+#: locale/ipp-strings.c:1006
 msgid "job-state-reasons.job-password-wait"
 msgstr ""
 
 #. TRANSLATORS: Job Printed Successfully
-#: locale/ipp-strings.c:1096
+#: locale/ipp-strings.c:1008
 msgid "job-state-reasons.job-printed-successfully"
 msgstr ""
 
 #. TRANSLATORS: Job Printed With Errors
-#: locale/ipp-strings.c:1098
+#: locale/ipp-strings.c:1010
 msgid "job-state-reasons.job-printed-with-errors"
 msgstr ""
 
 #. TRANSLATORS: Job Printed With Warnings
-#: locale/ipp-strings.c:1100
+#: locale/ipp-strings.c:1012
 msgid "job-state-reasons.job-printed-with-warnings"
 msgstr ""
 
-#. TRANSLATORS: Job Printing
-#: locale/ipp-strings.c:1102
+#. TRANSLATORS: Printing
+#: locale/ipp-strings.c:1014
 msgid "job-state-reasons.job-printing"
 msgstr ""
 
-#. TRANSLATORS: Job Queued
-#: locale/ipp-strings.c:1104
+#. TRANSLATORS: Preparing to print
+#: locale/ipp-strings.c:1016
 msgid "job-state-reasons.job-queued"
 msgstr ""
 
-#. TRANSLATORS: Job Queued For Marker
-#: locale/ipp-strings.c:1106
+#. TRANSLATORS: Processing document
+#: locale/ipp-strings.c:1018
 msgid "job-state-reasons.job-queued-for-marker"
 msgstr ""
 
 #. TRANSLATORS: Job Release Wait
-#: locale/ipp-strings.c:1108
+#: locale/ipp-strings.c:1020
 msgid "job-state-reasons.job-release-wait"
 msgstr ""
 
-#. TRANSLATORS: Job Restartable
-#: locale/ipp-strings.c:1110
+#. TRANSLATORS: Restartable
+#: locale/ipp-strings.c:1022
 msgid "job-state-reasons.job-restartable"
 msgstr ""
 
 #. TRANSLATORS: Job Resuming
-#: locale/ipp-strings.c:1112
+#: locale/ipp-strings.c:1024
 msgid "job-state-reasons.job-resuming"
 msgstr ""
 
 #. TRANSLATORS: Job Saved Successfully
-#: locale/ipp-strings.c:1114
+#: locale/ipp-strings.c:1026
 msgid "job-state-reasons.job-saved-successfully"
 msgstr ""
 
 #. TRANSLATORS: Job Saved With Errors
-#: locale/ipp-strings.c:1116
+#: locale/ipp-strings.c:1028
 msgid "job-state-reasons.job-saved-with-errors"
 msgstr ""
 
 #. TRANSLATORS: Job Saved With Warnings
-#: locale/ipp-strings.c:1118
+#: locale/ipp-strings.c:1030
 msgid "job-state-reasons.job-saved-with-warnings"
 msgstr ""
 
 #. TRANSLATORS: Job Saving
-#: locale/ipp-strings.c:1120
+#: locale/ipp-strings.c:1032
 msgid "job-state-reasons.job-saving"
 msgstr ""
 
 #. TRANSLATORS: Job Spooling
-#: locale/ipp-strings.c:1122
+#: locale/ipp-strings.c:1034
 msgid "job-state-reasons.job-spooling"
 msgstr ""
 
 #. TRANSLATORS: Job Streaming
-#: locale/ipp-strings.c:1124
+#: locale/ipp-strings.c:1036
 msgid "job-state-reasons.job-streaming"
 msgstr ""
 
-#. TRANSLATORS: Job Suspended
-#: locale/ipp-strings.c:1126
+#. TRANSLATORS: Suspended
+#: locale/ipp-strings.c:1038
 msgid "job-state-reasons.job-suspended"
 msgstr ""
 
 #. TRANSLATORS: Job Suspended By Operator
-#: locale/ipp-strings.c:1128
+#: locale/ipp-strings.c:1040
 msgid "job-state-reasons.job-suspended-by-operator"
 msgstr ""
 
 #. TRANSLATORS: Job Suspended By System
-#: locale/ipp-strings.c:1130
+#: locale/ipp-strings.c:1042
 msgid "job-state-reasons.job-suspended-by-system"
 msgstr ""
 
 #. TRANSLATORS: Job Suspended By User
-#: locale/ipp-strings.c:1132
+#: locale/ipp-strings.c:1044
 msgid "job-state-reasons.job-suspended-by-user"
 msgstr ""
 
 #. TRANSLATORS: Job Suspending
-#: locale/ipp-strings.c:1134
+#: locale/ipp-strings.c:1046
 msgid "job-state-reasons.job-suspending"
 msgstr ""
 
 #. TRANSLATORS: Job Transferring
-#: locale/ipp-strings.c:1136
+#: locale/ipp-strings.c:1048
 msgid "job-state-reasons.job-transferring"
 msgstr ""
 
-#. TRANSLATORS: Job Transforming
-#: locale/ipp-strings.c:1138
+#. TRANSLATORS: Transforming
+#: locale/ipp-strings.c:1050
 msgid "job-state-reasons.job-transforming"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:1140
+#: locale/ipp-strings.c:1052
 msgid "job-state-reasons.none"
 msgstr ""
 
-#. TRANSLATORS: Printer Stopped
-#: locale/ipp-strings.c:1142
+#. TRANSLATORS: Printer offline
+#: locale/ipp-strings.c:1054
 msgid "job-state-reasons.printer-stopped"
 msgstr ""
 
-#. TRANSLATORS: Printer Stopped Partly
-#: locale/ipp-strings.c:1144
+#. TRANSLATORS: Printer partially stopped
+#: locale/ipp-strings.c:1056
 msgid "job-state-reasons.printer-stopped-partly"
 msgstr ""
 
-#. TRANSLATORS: Processing To Stop Point
-#: locale/ipp-strings.c:1146
+#. TRANSLATORS: Stopping
+#: locale/ipp-strings.c:1058
 msgid "job-state-reasons.processing-to-stop-point"
 msgstr ""
 
-#. TRANSLATORS: Queued In Device
-#: locale/ipp-strings.c:1148
+#. TRANSLATORS: Ready
+#: locale/ipp-strings.c:1060
 msgid "job-state-reasons.queued-in-device"
 msgstr ""
 
 #. TRANSLATORS: Resources Are Not Ready
-#: locale/ipp-strings.c:1150
+#: locale/ipp-strings.c:1062
 msgid "job-state-reasons.resources-are-not-ready"
 msgstr ""
 
 #. TRANSLATORS: Resources Are Not Supported
-#: locale/ipp-strings.c:1152
+#: locale/ipp-strings.c:1064
 msgid "job-state-reasons.resources-are-not-supported"
 msgstr ""
 
-#. TRANSLATORS: Service Off Line
-#: locale/ipp-strings.c:1154
+#. TRANSLATORS: Service offline
+#: locale/ipp-strings.c:1066
 msgid "job-state-reasons.service-off-line"
 msgstr ""
 
 #. TRANSLATORS: Submission Interrupted
-#: locale/ipp-strings.c:1156
+#: locale/ipp-strings.c:1068
 msgid "job-state-reasons.submission-interrupted"
 msgstr ""
 
 #. TRANSLATORS: Unsupported Attributes Or Values
-#: locale/ipp-strings.c:1158
+#: locale/ipp-strings.c:1070
 msgid "job-state-reasons.unsupported-attributes-or-values"
 msgstr ""
 
 #. TRANSLATORS: Unsupported Compression
-#: locale/ipp-strings.c:1160
+#: locale/ipp-strings.c:1072
 msgid "job-state-reasons.unsupported-compression"
 msgstr ""
 
 #. TRANSLATORS: Unsupported Document Format
-#: locale/ipp-strings.c:1162
+#: locale/ipp-strings.c:1074
 msgid "job-state-reasons.unsupported-document-format"
 msgstr ""
 
 #. TRANSLATORS: Waiting For User Action
-#: locale/ipp-strings.c:1164
+#: locale/ipp-strings.c:1076
 msgid "job-state-reasons.waiting-for-user-action"
 msgstr ""
 
 #. TRANSLATORS: Warnings Detected
-#: locale/ipp-strings.c:1166
+#: locale/ipp-strings.c:1078
 msgid "job-state-reasons.warnings-detected"
 msgstr ""
 
 #. TRANSLATORS: Pending
-#: locale/ipp-strings.c:1168
+#: locale/ipp-strings.c:1080
 msgid "job-state.3"
 msgstr ""
 
 #. TRANSLATORS: Held
-#: locale/ipp-strings.c:1170
+#: locale/ipp-strings.c:1082
 msgid "job-state.4"
 msgstr ""
 
 #. TRANSLATORS: Processing
-#: locale/ipp-strings.c:1172
+#: locale/ipp-strings.c:1084
 msgid "job-state.5"
 msgstr ""
 
 #. TRANSLATORS: Stopped
-#: locale/ipp-strings.c:1174
+#: locale/ipp-strings.c:1086
 msgid "job-state.6"
 msgstr ""
 
 #. TRANSLATORS: Canceled
-#: locale/ipp-strings.c:1176
+#: locale/ipp-strings.c:1088
 msgid "job-state.7"
 msgstr ""
 
 #. TRANSLATORS: Aborted
-#: locale/ipp-strings.c:1178
+#: locale/ipp-strings.c:1090
 msgid "job-state.8"
 msgstr ""
 
 #. TRANSLATORS: Completed
-#: locale/ipp-strings.c:1180
+#: locale/ipp-strings.c:1092
 msgid "job-state.9"
 msgstr ""
 
 #. TRANSLATORS: Laminate Pages
-#: locale/ipp-strings.c:1182
+#: locale/ipp-strings.c:1094
 msgid "laminating"
 msgstr ""
 
 #. TRANSLATORS: Laminate
-#: locale/ipp-strings.c:1184
+#: locale/ipp-strings.c:1096
 msgid "laminating-sides"
 msgstr ""
 
 #. TRANSLATORS: Back Only
-#: locale/ipp-strings.c:1186
+#: locale/ipp-strings.c:1098
 msgid "laminating-sides.back"
 msgstr ""
 
 #. TRANSLATORS: Front and Back
-#: locale/ipp-strings.c:1188
+#: locale/ipp-strings.c:1100
 msgid "laminating-sides.both"
 msgstr ""
 
 #. TRANSLATORS: Front Only
-#: locale/ipp-strings.c:1190
+#: locale/ipp-strings.c:1102
 msgid "laminating-sides.front"
 msgstr ""
 
 #. TRANSLATORS: Type of Lamination
-#: locale/ipp-strings.c:1192
+#: locale/ipp-strings.c:1104
 msgid "laminating-type"
 msgstr ""
 
 #. TRANSLATORS: Archival
-#: locale/ipp-strings.c:1194
+#: locale/ipp-strings.c:1106
 msgid "laminating-type.archival"
 msgstr ""
 
 #. TRANSLATORS: Glossy
-#: locale/ipp-strings.c:1196
+#: locale/ipp-strings.c:1108
 msgid "laminating-type.glossy"
 msgstr ""
 
 #. TRANSLATORS: High Gloss
-#: locale/ipp-strings.c:1198
+#: locale/ipp-strings.c:1110
 msgid "laminating-type.high-gloss"
 msgstr ""
 
 #. TRANSLATORS: Matte
-#: locale/ipp-strings.c:1200
+#: locale/ipp-strings.c:1112
 msgid "laminating-type.matte"
 msgstr ""
 
 #. TRANSLATORS: Semi-gloss
-#: locale/ipp-strings.c:1202
+#: locale/ipp-strings.c:1114
 msgid "laminating-type.semi-gloss"
 msgstr ""
 
 #. TRANSLATORS: Translucent
-#: locale/ipp-strings.c:1204
+#: locale/ipp-strings.c:1116
 msgid "laminating-type.translucent"
 msgstr ""
 
 #. TRANSLATORS: Logo
-#: locale/ipp-strings.c:1206
+#: locale/ipp-strings.c:1118
 msgid "logo"
 msgstr ""
 
@@ -10267,2747 +10051,2752 @@ msgid "lpstat: error - %s environment variable names non-existent destination \"
 msgstr ""
 
 #. TRANSLATORS: Amount of Material
-#: locale/ipp-strings.c:1208
+#: locale/ipp-strings.c:1120
 msgid "material-amount"
 msgstr ""
 
 #. TRANSLATORS: Amount Units
-#: locale/ipp-strings.c:1210
+#: locale/ipp-strings.c:1122
 msgid "material-amount-units"
 msgstr ""
 
 #. TRANSLATORS: Grams
-#: locale/ipp-strings.c:1212
+#: locale/ipp-strings.c:1124
 msgid "material-amount-units.g"
 msgstr ""
 
 #. TRANSLATORS: Kilograms
-#: locale/ipp-strings.c:1214
+#: locale/ipp-strings.c:1126
 msgid "material-amount-units.kg"
 msgstr ""
 
 #. TRANSLATORS: Liters
-#: locale/ipp-strings.c:1216
+#: locale/ipp-strings.c:1128
 msgid "material-amount-units.l"
 msgstr ""
 
 #. TRANSLATORS: Meters
-#: locale/ipp-strings.c:1218
+#: locale/ipp-strings.c:1130
 msgid "material-amount-units.m"
 msgstr ""
 
 #. TRANSLATORS: Milliliters
-#: locale/ipp-strings.c:1220
+#: locale/ipp-strings.c:1132
 msgid "material-amount-units.ml"
 msgstr ""
 
 #. TRANSLATORS: Millimeters
-#: locale/ipp-strings.c:1222
+#: locale/ipp-strings.c:1134
 msgid "material-amount-units.mm"
 msgstr ""
 
 #. TRANSLATORS: Material Color
-#: locale/ipp-strings.c:1224
+#: locale/ipp-strings.c:1136
 msgid "material-color"
 msgstr ""
 
 #. TRANSLATORS: Material Diameter
-#: locale/ipp-strings.c:1226
+#: locale/ipp-strings.c:1138
 msgid "material-diameter"
 msgstr ""
 
 #. TRANSLATORS: Material Diameter Tolerance
-#: locale/ipp-strings.c:1228
+#: locale/ipp-strings.c:1140
 msgid "material-diameter-tolerance"
 msgstr ""
 
 #. TRANSLATORS: Material Fill Density
-#: locale/ipp-strings.c:1230
+#: locale/ipp-strings.c:1142
 msgid "material-fill-density"
 msgstr ""
 
 #. TRANSLATORS: Material Name
-#: locale/ipp-strings.c:1232
+#: locale/ipp-strings.c:1144
 msgid "material-name"
 msgstr ""
 
 #. TRANSLATORS: Material Nozzle Diameter
-#: locale/ipp-strings.c:1234
+#: locale/ipp-strings.c:1146
 msgid "material-nozzle-diameter"
 msgstr ""
 
 #. TRANSLATORS: Use Material For
-#: locale/ipp-strings.c:1236
+#: locale/ipp-strings.c:1148
 msgid "material-purpose"
 msgstr ""
 
 #. TRANSLATORS: Everything
-#: locale/ipp-strings.c:1238
+#: locale/ipp-strings.c:1150
 msgid "material-purpose.all"
 msgstr ""
 
 #. TRANSLATORS: Base
-#: locale/ipp-strings.c:1240
+#: locale/ipp-strings.c:1152
 msgid "material-purpose.base"
 msgstr ""
 
 #. TRANSLATORS: In-fill
-#: locale/ipp-strings.c:1242
+#: locale/ipp-strings.c:1154
 msgid "material-purpose.in-fill"
 msgstr ""
 
 #. TRANSLATORS: Shell
-#: locale/ipp-strings.c:1244
+#: locale/ipp-strings.c:1156
 msgid "material-purpose.shell"
 msgstr ""
 
 #. TRANSLATORS: Supports
-#: locale/ipp-strings.c:1246
+#: locale/ipp-strings.c:1158
 msgid "material-purpose.support"
 msgstr ""
 
 #. TRANSLATORS: Feed Rate
-#: locale/ipp-strings.c:1248
+#: locale/ipp-strings.c:1160
 msgid "material-rate"
 msgstr ""
 
 #. TRANSLATORS: Feed Rate Units
-#: locale/ipp-strings.c:1250
+#: locale/ipp-strings.c:1162
 msgid "material-rate-units"
 msgstr ""
 
 #. TRANSLATORS: Milligrams per second
-#: locale/ipp-strings.c:1252
+#: locale/ipp-strings.c:1164
 msgid "material-rate-units.mg_second"
 msgstr ""
 
 #. TRANSLATORS: Milliliters per second
-#: locale/ipp-strings.c:1254
+#: locale/ipp-strings.c:1166
 msgid "material-rate-units.ml_second"
 msgstr ""
 
 #. TRANSLATORS: Millimeters per second
-#: locale/ipp-strings.c:1256
+#: locale/ipp-strings.c:1168
 msgid "material-rate-units.mm_second"
 msgstr ""
 
 #. TRANSLATORS: Material Retraction
-#: locale/ipp-strings.c:1258
+#: locale/ipp-strings.c:1170
 msgid "material-retraction"
 msgstr ""
 
 #. TRANSLATORS: Material Shell Thickness
-#: locale/ipp-strings.c:1260
+#: locale/ipp-strings.c:1172
 msgid "material-shell-thickness"
 msgstr ""
 
 #. TRANSLATORS: Material Temperature
-#: locale/ipp-strings.c:1262
+#: locale/ipp-strings.c:1174
 msgid "material-temperature"
 msgstr ""
 
 #. TRANSLATORS: Material Type
-#: locale/ipp-strings.c:1264
+#: locale/ipp-strings.c:1176
 msgid "material-type"
 msgstr ""
 
 #. TRANSLATORS: ABS
-#: locale/ipp-strings.c:1266
+#: locale/ipp-strings.c:1178
 msgid "material-type.abs"
 msgstr ""
 
 #. TRANSLATORS: Carbon Fiber ABS
-#: locale/ipp-strings.c:1268
+#: locale/ipp-strings.c:1180
 msgid "material-type.abs-carbon-fiber"
 msgstr ""
 
 #. TRANSLATORS: Carbon Nanotube ABS
-#: locale/ipp-strings.c:1270
+#: locale/ipp-strings.c:1182
 msgid "material-type.abs-carbon-nanotube"
 msgstr ""
 
 #. TRANSLATORS: Chocolate
-#: locale/ipp-strings.c:1272
+#: locale/ipp-strings.c:1184
 msgid "material-type.chocolate"
 msgstr ""
 
 #. TRANSLATORS: Gold
-#: locale/ipp-strings.c:1274
+#: locale/ipp-strings.c:1186
 msgid "material-type.gold"
 msgstr ""
 
 #. TRANSLATORS: Nylon
-#: locale/ipp-strings.c:1276
+#: locale/ipp-strings.c:1188
 msgid "material-type.nylon"
 msgstr ""
 
 #. TRANSLATORS: Pet
-#: locale/ipp-strings.c:1278
+#: locale/ipp-strings.c:1190
 msgid "material-type.pet"
 msgstr ""
 
 #. TRANSLATORS: Photopolymer
-#: locale/ipp-strings.c:1280
+#: locale/ipp-strings.c:1192
 msgid "material-type.photopolymer"
 msgstr ""
 
 #. TRANSLATORS: PLA
-#: locale/ipp-strings.c:1282
+#: locale/ipp-strings.c:1194
 msgid "material-type.pla"
 msgstr ""
 
 #. TRANSLATORS: Conductive PLA
-#: locale/ipp-strings.c:1284
+#: locale/ipp-strings.c:1196
 msgid "material-type.pla-conductive"
 msgstr ""
 
 #. TRANSLATORS: Pla Dissolvable
-#: locale/ipp-strings.c:1286
+#: locale/ipp-strings.c:1198
 msgid "material-type.pla-dissolvable"
 msgstr ""
 
 #. TRANSLATORS: Flexible PLA
-#: locale/ipp-strings.c:1288
+#: locale/ipp-strings.c:1200
 msgid "material-type.pla-flexible"
 msgstr ""
 
 #. TRANSLATORS: Magnetic PLA
-#: locale/ipp-strings.c:1290
+#: locale/ipp-strings.c:1202
 msgid "material-type.pla-magnetic"
 msgstr ""
 
 #. TRANSLATORS: Steel PLA
-#: locale/ipp-strings.c:1292
+#: locale/ipp-strings.c:1204
 msgid "material-type.pla-steel"
 msgstr ""
 
 #. TRANSLATORS: Stone PLA
-#: locale/ipp-strings.c:1294
+#: locale/ipp-strings.c:1206
 msgid "material-type.pla-stone"
 msgstr ""
 
 #. TRANSLATORS: Wood PLA
-#: locale/ipp-strings.c:1296
+#: locale/ipp-strings.c:1208
 msgid "material-type.pla-wood"
 msgstr ""
 
 #. TRANSLATORS: Polycarbonate
-#: locale/ipp-strings.c:1298
+#: locale/ipp-strings.c:1210
 msgid "material-type.polycarbonate"
 msgstr ""
 
 #. TRANSLATORS: Dissolvable PVA
-#: locale/ipp-strings.c:1300
+#: locale/ipp-strings.c:1212
 msgid "material-type.pva-dissolvable"
 msgstr ""
 
 #. TRANSLATORS: Silver
-#: locale/ipp-strings.c:1302
+#: locale/ipp-strings.c:1214
 msgid "material-type.silver"
 msgstr ""
 
 #. TRANSLATORS: Titanium
-#: locale/ipp-strings.c:1304
+#: locale/ipp-strings.c:1216
 msgid "material-type.titanium"
 msgstr ""
 
 #. TRANSLATORS: Wax
-#: locale/ipp-strings.c:1306
+#: locale/ipp-strings.c:1218
 msgid "material-type.wax"
 msgstr ""
 
 #. TRANSLATORS: Materials
-#: locale/ipp-strings.c:1308
+#: locale/ipp-strings.c:1220
 msgid "materials-col"
 msgstr ""
 
 #. TRANSLATORS: Media
-#: locale/ipp-strings.c:1310
+#: locale/ipp-strings.c:1222
 msgid "media"
 msgstr ""
 
 #. TRANSLATORS: Back Coating of Media
-#: locale/ipp-strings.c:1312
+#: locale/ipp-strings.c:1224
 msgid "media-back-coating"
 msgstr ""
 
 #. TRANSLATORS: Glossy
-#: locale/ipp-strings.c:1314
+#: locale/ipp-strings.c:1226
 msgid "media-back-coating.glossy"
 msgstr ""
 
 #. TRANSLATORS: High Gloss
-#: locale/ipp-strings.c:1316
+#: locale/ipp-strings.c:1228
 msgid "media-back-coating.high-gloss"
 msgstr ""
 
 #. TRANSLATORS: Matte
-#: locale/ipp-strings.c:1318
+#: locale/ipp-strings.c:1230
 msgid "media-back-coating.matte"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:1320
+#: locale/ipp-strings.c:1232
 msgid "media-back-coating.none"
 msgstr ""
 
 #. TRANSLATORS: Satin
-#: locale/ipp-strings.c:1322
+#: locale/ipp-strings.c:1234
 msgid "media-back-coating.satin"
 msgstr ""
 
 #. TRANSLATORS: Semi-gloss
-#: locale/ipp-strings.c:1324
+#: locale/ipp-strings.c:1236
 msgid "media-back-coating.semi-gloss"
 msgstr ""
 
 #. TRANSLATORS: Media Bottom Margin
-#: locale/ipp-strings.c:1326
+#: locale/ipp-strings.c:1238
 msgid "media-bottom-margin"
 msgstr ""
 
 #. TRANSLATORS: Media
-#: locale/ipp-strings.c:1328
+#: locale/ipp-strings.c:1240
 msgid "media-col"
 msgstr ""
 
 #. TRANSLATORS: Media Color
-#: locale/ipp-strings.c:1330
+#: locale/ipp-strings.c:1242
 msgid "media-color"
 msgstr ""
 
 #. TRANSLATORS: Black
-#: locale/ipp-strings.c:1332
+#: locale/ipp-strings.c:1244
 msgid "media-color.black"
 msgstr ""
 
 #. TRANSLATORS: Blue
-#: locale/ipp-strings.c:1334
+#: locale/ipp-strings.c:1246
 msgid "media-color.blue"
 msgstr ""
 
 #. TRANSLATORS: Brown
-#: locale/ipp-strings.c:1336
+#: locale/ipp-strings.c:1248
 msgid "media-color.brown"
 msgstr ""
 
 #. TRANSLATORS: Buff
-#: locale/ipp-strings.c:1338
+#: locale/ipp-strings.c:1250
 msgid "media-color.buff"
 msgstr ""
 
 #. TRANSLATORS: Clear Black
-#: locale/ipp-strings.c:1340
+#: locale/ipp-strings.c:1252
 msgid "media-color.clear-black"
 msgstr ""
 
 #. TRANSLATORS: Clear Blue
-#: locale/ipp-strings.c:1342
+#: locale/ipp-strings.c:1254
 msgid "media-color.clear-blue"
 msgstr ""
 
 #. TRANSLATORS: Clear Brown
-#: locale/ipp-strings.c:1344
+#: locale/ipp-strings.c:1256
 msgid "media-color.clear-brown"
 msgstr ""
 
 #. TRANSLATORS: Clear Buff
-#: locale/ipp-strings.c:1346
+#: locale/ipp-strings.c:1258
 msgid "media-color.clear-buff"
 msgstr ""
 
 #. TRANSLATORS: Clear Cyan
-#: locale/ipp-strings.c:1348
+#: locale/ipp-strings.c:1260
 msgid "media-color.clear-cyan"
 msgstr ""
 
 #. TRANSLATORS: Clear Gold
-#: locale/ipp-strings.c:1350
+#: locale/ipp-strings.c:1262
 msgid "media-color.clear-gold"
 msgstr ""
 
 #. TRANSLATORS: Clear Goldenrod
-#: locale/ipp-strings.c:1352
+#: locale/ipp-strings.c:1264
 msgid "media-color.clear-goldenrod"
 msgstr ""
 
 #. TRANSLATORS: Clear Gray
-#: locale/ipp-strings.c:1354
+#: locale/ipp-strings.c:1266
 msgid "media-color.clear-gray"
 msgstr ""
 
 #. TRANSLATORS: Clear Green
-#: locale/ipp-strings.c:1356
+#: locale/ipp-strings.c:1268
 msgid "media-color.clear-green"
 msgstr ""
 
 #. TRANSLATORS: Clear Ivory
-#: locale/ipp-strings.c:1358
+#: locale/ipp-strings.c:1270
 msgid "media-color.clear-ivory"
 msgstr ""
 
 #. TRANSLATORS: Clear Magenta
-#: locale/ipp-strings.c:1360
+#: locale/ipp-strings.c:1272
 msgid "media-color.clear-magenta"
 msgstr ""
 
 #. TRANSLATORS: Clear Multi Color
-#: locale/ipp-strings.c:1362
+#: locale/ipp-strings.c:1274
 msgid "media-color.clear-multi-color"
 msgstr ""
 
 #. TRANSLATORS: Clear Mustard
-#: locale/ipp-strings.c:1364
+#: locale/ipp-strings.c:1276
 msgid "media-color.clear-mustard"
 msgstr ""
 
 #. TRANSLATORS: Clear Orange
-#: locale/ipp-strings.c:1366
+#: locale/ipp-strings.c:1278
 msgid "media-color.clear-orange"
 msgstr ""
 
 #. TRANSLATORS: Clear Pink
-#: locale/ipp-strings.c:1368
+#: locale/ipp-strings.c:1280
 msgid "media-color.clear-pink"
 msgstr ""
 
 #. TRANSLATORS: Clear Red
-#: locale/ipp-strings.c:1370
+#: locale/ipp-strings.c:1282
 msgid "media-color.clear-red"
 msgstr ""
 
 #. TRANSLATORS: Clear Silver
-#: locale/ipp-strings.c:1372
+#: locale/ipp-strings.c:1284
 msgid "media-color.clear-silver"
 msgstr ""
 
 #. TRANSLATORS: Clear Turquoise
-#: locale/ipp-strings.c:1374
+#: locale/ipp-strings.c:1286
 msgid "media-color.clear-turquoise"
 msgstr ""
 
 #. TRANSLATORS: Clear Violet
-#: locale/ipp-strings.c:1376
+#: locale/ipp-strings.c:1288
 msgid "media-color.clear-violet"
 msgstr ""
 
 #. TRANSLATORS: Clear White
-#: locale/ipp-strings.c:1378
+#: locale/ipp-strings.c:1290
 msgid "media-color.clear-white"
 msgstr ""
 
 #. TRANSLATORS: Clear Yellow
-#: locale/ipp-strings.c:1380
+#: locale/ipp-strings.c:1292
 msgid "media-color.clear-yellow"
 msgstr ""
 
 #. TRANSLATORS: Cyan
-#: locale/ipp-strings.c:1382
+#: locale/ipp-strings.c:1294
 msgid "media-color.cyan"
 msgstr ""
 
 #. TRANSLATORS: Dark Blue
-#: locale/ipp-strings.c:1384
+#: locale/ipp-strings.c:1296
 msgid "media-color.dark-blue"
 msgstr ""
 
 #. TRANSLATORS: Dark Brown
-#: locale/ipp-strings.c:1386
+#: locale/ipp-strings.c:1298
 msgid "media-color.dark-brown"
 msgstr ""
 
 #. TRANSLATORS: Dark Buff
-#: locale/ipp-strings.c:1388
+#: locale/ipp-strings.c:1300
 msgid "media-color.dark-buff"
 msgstr ""
 
 #. TRANSLATORS: Dark Cyan
-#: locale/ipp-strings.c:1390
+#: locale/ipp-strings.c:1302
 msgid "media-color.dark-cyan"
 msgstr ""
 
 #. TRANSLATORS: Dark Gold
-#: locale/ipp-strings.c:1392
+#: locale/ipp-strings.c:1304
 msgid "media-color.dark-gold"
 msgstr ""
 
 #. TRANSLATORS: Dark Goldenrod
-#: locale/ipp-strings.c:1394
+#: locale/ipp-strings.c:1306
 msgid "media-color.dark-goldenrod"
 msgstr ""
 
 #. TRANSLATORS: Dark Gray
-#: locale/ipp-strings.c:1396
+#: locale/ipp-strings.c:1308
 msgid "media-color.dark-gray"
 msgstr ""
 
 #. TRANSLATORS: Dark Green
-#: locale/ipp-strings.c:1398
+#: locale/ipp-strings.c:1310
 msgid "media-color.dark-green"
 msgstr ""
 
 #. TRANSLATORS: Dark Ivory
-#: locale/ipp-strings.c:1400
+#: locale/ipp-strings.c:1312
 msgid "media-color.dark-ivory"
 msgstr ""
 
 #. TRANSLATORS: Dark Magenta
-#: locale/ipp-strings.c:1402
+#: locale/ipp-strings.c:1314
 msgid "media-color.dark-magenta"
 msgstr ""
 
 #. TRANSLATORS: Dark Mustard
-#: locale/ipp-strings.c:1404
+#: locale/ipp-strings.c:1316
 msgid "media-color.dark-mustard"
 msgstr ""
 
 #. TRANSLATORS: Dark Orange
-#: locale/ipp-strings.c:1406
+#: locale/ipp-strings.c:1318
 msgid "media-color.dark-orange"
 msgstr ""
 
 #. TRANSLATORS: Dark Pink
-#: locale/ipp-strings.c:1408
+#: locale/ipp-strings.c:1320
 msgid "media-color.dark-pink"
 msgstr ""
 
 #. TRANSLATORS: Dark Red
-#: locale/ipp-strings.c:1410
+#: locale/ipp-strings.c:1322
 msgid "media-color.dark-red"
 msgstr ""
 
 #. TRANSLATORS: Dark Silver
-#: locale/ipp-strings.c:1412
+#: locale/ipp-strings.c:1324
 msgid "media-color.dark-silver"
 msgstr ""
 
 #. TRANSLATORS: Dark Turquoise
-#: locale/ipp-strings.c:1414
+#: locale/ipp-strings.c:1326
 msgid "media-color.dark-turquoise"
 msgstr ""
 
 #. TRANSLATORS: Dark Violet
-#: locale/ipp-strings.c:1416
+#: locale/ipp-strings.c:1328
 msgid "media-color.dark-violet"
 msgstr ""
 
 #. TRANSLATORS: Dark Yellow
-#: locale/ipp-strings.c:1418
+#: locale/ipp-strings.c:1330
 msgid "media-color.dark-yellow"
 msgstr ""
 
 #. TRANSLATORS: Gold
-#: locale/ipp-strings.c:1420
+#: locale/ipp-strings.c:1332
 msgid "media-color.gold"
 msgstr ""
 
 #. TRANSLATORS: Goldenrod
-#: locale/ipp-strings.c:1422
+#: locale/ipp-strings.c:1334
 msgid "media-color.goldenrod"
 msgstr ""
 
 #. TRANSLATORS: Gray
-#: locale/ipp-strings.c:1424
+#: locale/ipp-strings.c:1336
 msgid "media-color.gray"
 msgstr ""
 
 #. TRANSLATORS: Green
-#: locale/ipp-strings.c:1426
+#: locale/ipp-strings.c:1338
 msgid "media-color.green"
 msgstr ""
 
 #. TRANSLATORS: Ivory
-#: locale/ipp-strings.c:1428
+#: locale/ipp-strings.c:1340
 msgid "media-color.ivory"
 msgstr ""
 
 #. TRANSLATORS: Light Black
-#: locale/ipp-strings.c:1430
+#: locale/ipp-strings.c:1342
 msgid "media-color.light-black"
 msgstr ""
 
 #. TRANSLATORS: Light Blue
-#: locale/ipp-strings.c:1432
+#: locale/ipp-strings.c:1344
 msgid "media-color.light-blue"
 msgstr ""
 
 #. TRANSLATORS: Light Brown
-#: locale/ipp-strings.c:1434
+#: locale/ipp-strings.c:1346
 msgid "media-color.light-brown"
 msgstr ""
 
 #. TRANSLATORS: Light Buff
-#: locale/ipp-strings.c:1436
+#: locale/ipp-strings.c:1348
 msgid "media-color.light-buff"
 msgstr ""
 
 #. TRANSLATORS: Light Cyan
-#: locale/ipp-strings.c:1438
+#: locale/ipp-strings.c:1350
 msgid "media-color.light-cyan"
 msgstr ""
 
 #. TRANSLATORS: Light Gold
-#: locale/ipp-strings.c:1440
+#: locale/ipp-strings.c:1352
 msgid "media-color.light-gold"
 msgstr ""
 
 #. TRANSLATORS: Light Goldenrod
-#: locale/ipp-strings.c:1442
+#: locale/ipp-strings.c:1354
 msgid "media-color.light-goldenrod"
 msgstr ""
 
 #. TRANSLATORS: Light Gray
-#: locale/ipp-strings.c:1444
+#: locale/ipp-strings.c:1356
 msgid "media-color.light-gray"
 msgstr ""
 
 #. TRANSLATORS: Light Green
-#: locale/ipp-strings.c:1446
+#: locale/ipp-strings.c:1358
 msgid "media-color.light-green"
 msgstr ""
 
 #. TRANSLATORS: Light Ivory
-#: locale/ipp-strings.c:1448
+#: locale/ipp-strings.c:1360
 msgid "media-color.light-ivory"
 msgstr ""
 
 #. TRANSLATORS: Light Magenta
-#: locale/ipp-strings.c:1450
+#: locale/ipp-strings.c:1362
 msgid "media-color.light-magenta"
 msgstr ""
 
 #. TRANSLATORS: Light Mustard
-#: locale/ipp-strings.c:1452
+#: locale/ipp-strings.c:1364
 msgid "media-color.light-mustard"
 msgstr ""
 
 #. TRANSLATORS: Light Orange
-#: locale/ipp-strings.c:1454
+#: locale/ipp-strings.c:1366
 msgid "media-color.light-orange"
 msgstr ""
 
 #. TRANSLATORS: Light Pink
-#: locale/ipp-strings.c:1456
+#: locale/ipp-strings.c:1368
 msgid "media-color.light-pink"
 msgstr ""
 
 #. TRANSLATORS: Light Red
-#: locale/ipp-strings.c:1458
+#: locale/ipp-strings.c:1370
 msgid "media-color.light-red"
 msgstr ""
 
 #. TRANSLATORS: Light Silver
-#: locale/ipp-strings.c:1460
+#: locale/ipp-strings.c:1372
 msgid "media-color.light-silver"
 msgstr ""
 
 #. TRANSLATORS: Light Turquoise
-#: locale/ipp-strings.c:1462
+#: locale/ipp-strings.c:1374
 msgid "media-color.light-turquoise"
 msgstr ""
 
 #. TRANSLATORS: Light Violet
-#: locale/ipp-strings.c:1464
+#: locale/ipp-strings.c:1376
 msgid "media-color.light-violet"
 msgstr ""
 
 #. TRANSLATORS: Light Yellow
-#: locale/ipp-strings.c:1466
+#: locale/ipp-strings.c:1378
 msgid "media-color.light-yellow"
 msgstr ""
 
 #. TRANSLATORS: Magenta
-#: locale/ipp-strings.c:1468
+#: locale/ipp-strings.c:1380
 msgid "media-color.magenta"
 msgstr ""
 
 #. TRANSLATORS: Multi-color
-#: locale/ipp-strings.c:1470
+#: locale/ipp-strings.c:1382
 msgid "media-color.multi-color"
 msgstr ""
 
 #. TRANSLATORS: Mustard
-#: locale/ipp-strings.c:1472
+#: locale/ipp-strings.c:1384
 msgid "media-color.mustard"
 msgstr ""
 
 #. TRANSLATORS: No Color
-#: locale/ipp-strings.c:1474
+#: locale/ipp-strings.c:1386
 msgid "media-color.no-color"
 msgstr ""
 
 #. TRANSLATORS: Orange
-#: locale/ipp-strings.c:1476
+#: locale/ipp-strings.c:1388
 msgid "media-color.orange"
 msgstr ""
 
 #. TRANSLATORS: Pink
-#: locale/ipp-strings.c:1478
+#: locale/ipp-strings.c:1390
 msgid "media-color.pink"
 msgstr ""
 
 #. TRANSLATORS: Red
-#: locale/ipp-strings.c:1480
+#: locale/ipp-strings.c:1392
 msgid "media-color.red"
 msgstr ""
 
 #. TRANSLATORS: Silver
-#: locale/ipp-strings.c:1482
+#: locale/ipp-strings.c:1394
 msgid "media-color.silver"
 msgstr ""
 
 #. TRANSLATORS: Turquoise
-#: locale/ipp-strings.c:1484
+#: locale/ipp-strings.c:1396
 msgid "media-color.turquoise"
 msgstr ""
 
 #. TRANSLATORS: Violet
-#: locale/ipp-strings.c:1486
+#: locale/ipp-strings.c:1398
 msgid "media-color.violet"
 msgstr ""
 
 #. TRANSLATORS: White
-#: locale/ipp-strings.c:1488
+#: locale/ipp-strings.c:1400
 msgid "media-color.white"
 msgstr ""
 
 #. TRANSLATORS: Yellow
-#: locale/ipp-strings.c:1490
+#: locale/ipp-strings.c:1402
 msgid "media-color.yellow"
 msgstr ""
 
 #. TRANSLATORS: Front Coating of Media
-#: locale/ipp-strings.c:1492
+#: locale/ipp-strings.c:1404
 msgid "media-front-coating"
 msgstr ""
 
 #. TRANSLATORS: Media Grain
-#: locale/ipp-strings.c:1494
+#: locale/ipp-strings.c:1406
 msgid "media-grain"
 msgstr ""
 
 #. TRANSLATORS: Cross-Feed Direction
-#: locale/ipp-strings.c:1496
+#: locale/ipp-strings.c:1408
 msgid "media-grain.x-direction"
 msgstr ""
 
 #. TRANSLATORS: Feed Direction
-#: locale/ipp-strings.c:1498
+#: locale/ipp-strings.c:1410
 msgid "media-grain.y-direction"
 msgstr ""
 
 #. TRANSLATORS: Media Hole Count
-#: locale/ipp-strings.c:1500
+#: locale/ipp-strings.c:1412
 msgid "media-hole-count"
 msgstr ""
 
 #. TRANSLATORS: Media Info
-#: locale/ipp-strings.c:1502
+#: locale/ipp-strings.c:1414
 msgid "media-info"
 msgstr ""
 
 #. TRANSLATORS: Force Media
-#: locale/ipp-strings.c:1504
+#: locale/ipp-strings.c:1416
 msgid "media-input-tray-check"
 msgstr ""
 
 #. TRANSLATORS: Media Left Margin
-#: locale/ipp-strings.c:1506
+#: locale/ipp-strings.c:1418
 msgid "media-left-margin"
 msgstr ""
 
 #. TRANSLATORS: Pre-printed Media
-#: locale/ipp-strings.c:1508
+#: locale/ipp-strings.c:1420
 msgid "media-pre-printed"
 msgstr ""
 
 #. TRANSLATORS: Blank
-#: locale/ipp-strings.c:1510
+#: locale/ipp-strings.c:1422
 msgid "media-pre-printed.blank"
 msgstr ""
 
 #. TRANSLATORS: Letterhead
-#: locale/ipp-strings.c:1512
+#: locale/ipp-strings.c:1424
 msgid "media-pre-printed.letter-head"
 msgstr ""
 
 #. TRANSLATORS: Pre-printed
-#: locale/ipp-strings.c:1514
+#: locale/ipp-strings.c:1426
 msgid "media-pre-printed.pre-printed"
 msgstr ""
 
 #. TRANSLATORS: Recycled Media
-#: locale/ipp-strings.c:1516
+#: locale/ipp-strings.c:1428
 msgid "media-recycled"
 msgstr ""
 
 #. TRANSLATORS: None
-#: locale/ipp-strings.c:1518
+#: locale/ipp-strings.c:1430
 msgid "media-recycled.none"
 msgstr ""
 
 #. TRANSLATORS: Standard
-#: locale/ipp-strings.c:1520
+#: locale/ipp-strings.c:1432
 msgid "media-recycled.standard"
 msgstr ""
 
 #. TRANSLATORS: Media Right Margin
-#: locale/ipp-strings.c:1522
+#: locale/ipp-strings.c:1434
 msgid "media-right-margin"
 msgstr ""
 
 #. TRANSLATORS: Media Dimensions
-#: locale/ipp-strings.c:1524
+#: locale/ipp-strings.c:1436
 msgid "media-size"
 msgstr ""
 
 #. TRANSLATORS: Media Name
-#: locale/ipp-strings.c:1526
+#: locale/ipp-strings.c:1438
 msgid "media-size-name"
 msgstr ""
 
 #. TRANSLATORS: Media Source
-#: locale/ipp-strings.c:1528
+#: locale/ipp-strings.c:1440
 msgid "media-source"
 msgstr ""
 
 #. TRANSLATORS: Alternate
-#: locale/ipp-strings.c:1530
+#: locale/ipp-strings.c:1442
 msgid "media-source.alternate"
 msgstr ""
 
 #. TRANSLATORS: Alternate Roll
-#: locale/ipp-strings.c:1532
+#: locale/ipp-strings.c:1444
 msgid "media-source.alternate-roll"
 msgstr ""
 
 #. TRANSLATORS: Automatic
-#: locale/ipp-strings.c:1534
+#: locale/ipp-strings.c:1446
 msgid "media-source.auto"
 msgstr ""
 
 #. TRANSLATORS: Bottom
-#: locale/ipp-strings.c:1536
+#: locale/ipp-strings.c:1448
 msgid "media-source.bottom"
 msgstr ""
 
 #. TRANSLATORS: By-pass Tray
-#: locale/ipp-strings.c:1538
+#: locale/ipp-strings.c:1450
 msgid "media-source.by-pass-tray"
 msgstr ""
 
 #. TRANSLATORS: Center
-#: locale/ipp-strings.c:1540
+#: locale/ipp-strings.c:1452
 msgid "media-source.center"
 msgstr ""
 
 #. TRANSLATORS: Disc
-#: locale/ipp-strings.c:1542
+#: locale/ipp-strings.c:1454
 msgid "media-source.disc"
 msgstr ""
 
 #. TRANSLATORS: Envelope
-#: locale/ipp-strings.c:1544
+#: locale/ipp-strings.c:1456
 msgid "media-source.envelope"
 msgstr ""
 
 #. TRANSLATORS: Hagaki
-#: locale/ipp-strings.c:1546
+#: locale/ipp-strings.c:1458
 msgid "media-source.hagaki"
 msgstr ""
 
 #. TRANSLATORS: Large Capacity
-#: locale/ipp-strings.c:1548
+#: locale/ipp-strings.c:1460
 msgid "media-source.large-capacity"
 msgstr ""
 
 #. TRANSLATORS: Left
-#: locale/ipp-strings.c:1550
+#: locale/ipp-strings.c:1462
 msgid "media-source.left"
 msgstr ""
 
 #. TRANSLATORS: Main
-#: locale/ipp-strings.c:1552
+#: locale/ipp-strings.c:1464
 msgid "media-source.main"
 msgstr ""
 
 #. TRANSLATORS: Main Roll
-#: locale/ipp-strings.c:1554
+#: locale/ipp-strings.c:1466
 msgid "media-source.main-roll"
 msgstr ""
 
 #. TRANSLATORS: Manual
-#: locale/ipp-strings.c:1556
+#: locale/ipp-strings.c:1468
 msgid "media-source.manual"
 msgstr ""
 
 #. TRANSLATORS: Middle
-#: locale/ipp-strings.c:1558
+#: locale/ipp-strings.c:1470
 msgid "media-source.middle"
 msgstr ""
 
 #. TRANSLATORS: Photo
-#: locale/ipp-strings.c:1560
+#: locale/ipp-strings.c:1472
 msgid "media-source.photo"
 msgstr ""
 
 #. TRANSLATORS: Rear
-#: locale/ipp-strings.c:1562
+#: locale/ipp-strings.c:1474
 msgid "media-source.rear"
 msgstr ""
 
 #. TRANSLATORS: Right
-#: locale/ipp-strings.c:1564
+#: locale/ipp-strings.c:1476
 msgid "media-source.right"
 msgstr ""
 
 #. TRANSLATORS: Roll 1
-#: locale/ipp-strings.c:1566
+#: locale/ipp-strings.c:1478
 msgid "media-source.roll-1"
 msgstr ""
 
 #. TRANSLATORS: Roll 10
-#: locale/ipp-strings.c:1568
+#: locale/ipp-strings.c:1480
 msgid "media-source.roll-10"
 msgstr ""
 
 #. TRANSLATORS: Roll 2
-#: locale/ipp-strings.c:1570
+#: locale/ipp-strings.c:1482
 msgid "media-source.roll-2"
 msgstr ""
 
 #. TRANSLATORS: Roll 3
-#: locale/ipp-strings.c:1572
+#: locale/ipp-strings.c:1484
 msgid "media-source.roll-3"
 msgstr ""
 
 #. TRANSLATORS: Roll 4
-#: locale/ipp-strings.c:1574
+#: locale/ipp-strings.c:1486
 msgid "media-source.roll-4"
 msgstr ""
 
 #. TRANSLATORS: Roll 5
-#: locale/ipp-strings.c:1576
+#: locale/ipp-strings.c:1488
 msgid "media-source.roll-5"
 msgstr ""
 
 #. TRANSLATORS: Roll 6
-#: locale/ipp-strings.c:1578
+#: locale/ipp-strings.c:1490
 msgid "media-source.roll-6"
 msgstr ""
 
 #. TRANSLATORS: Roll 7
-#: locale/ipp-strings.c:1580
+#: locale/ipp-strings.c:1492
 msgid "media-source.roll-7"
 msgstr ""
 
 #. TRANSLATORS: Roll 8
-#: locale/ipp-strings.c:1582
+#: locale/ipp-strings.c:1494
 msgid "media-source.roll-8"
 msgstr ""
 
 #. TRANSLATORS: Roll 9
-#: locale/ipp-strings.c:1584
+#: locale/ipp-strings.c:1496
 msgid "media-source.roll-9"
 msgstr ""
 
 #. TRANSLATORS: Side
-#: locale/ipp-strings.c:1586
+#: locale/ipp-strings.c:1498
 msgid "media-source.side"
 msgstr ""
 
 #. TRANSLATORS: Top
-#: locale/ipp-strings.c:1588
+#: locale/ipp-strings.c:1500
 msgid "media-source.top"
 msgstr ""
 
 #. TRANSLATORS: Tray 1
-#: locale/ipp-strings.c:1590
+#: locale/ipp-strings.c:1502
 msgid "media-source.tray-1"
 msgstr ""
 
 #. TRANSLATORS: Tray 10
-#: locale/ipp-strings.c:1592
+#: locale/ipp-strings.c:1504
 msgid "media-source.tray-10"
 msgstr ""
 
 #. TRANSLATORS: Tray 11
-#: locale/ipp-strings.c:1594
+#: locale/ipp-strings.c:1506
 msgid "media-source.tray-11"
 msgstr ""
 
 #. TRANSLATORS: Tray 12
-#: locale/ipp-strings.c:1596
+#: locale/ipp-strings.c:1508
 msgid "media-source.tray-12"
 msgstr ""
 
 #. TRANSLATORS: Tray 13
-#: locale/ipp-strings.c:1598
+#: locale/ipp-strings.c:1510
 msgid "media-source.tray-13"
 msgstr ""
 
 #. TRANSLATORS: Tray 14
-#: locale/ipp-strings.c:1600
+#: locale/ipp-strings.c:1512
 msgid "media-source.tray-14"
 msgstr ""
 
 #. TRANSLATORS: Tray 15
-#: locale/ipp-strings.c:1602
+#: locale/ipp-strings.c:1514
 msgid "media-source.tray-15"
 msgstr ""
 
 #. TRANSLATORS: Tray 16
-#: locale/ipp-strings.c:1604
+#: locale/ipp-strings.c:1516
 msgid "media-source.tray-16"
 msgstr ""
 
 #. TRANSLATORS: Tray 17
-#: locale/ipp-strings.c:1606
+#: locale/ipp-strings.c:1518
 msgid "media-source.tray-17"
 msgstr ""
 
 #. TRANSLATORS: Tray 18
-#: locale/ipp-strings.c:1608
+#: locale/ipp-strings.c:1520
 msgid "media-source.tray-18"
 msgstr ""
 
 #. TRANSLATORS: Tray 19
-#: locale/ipp-strings.c:1610
+#: locale/ipp-strings.c:1522
 msgid "media-source.tray-19"
 msgstr ""
 
 #. TRANSLATORS: Tray 2
-#: locale/ipp-strings.c:1612
+#: locale/ipp-strings.c:1524
 msgid "media-source.tray-2"
 msgstr ""
 
 #. TRANSLATORS: Tray 20
-#: locale/ipp-strings.c:1614
+#: locale/ipp-strings.c:1526
 msgid "media-source.tray-20"
 msgstr ""
 
 #. TRANSLATORS: Tray 3
-#: locale/ipp-strings.c:1616
+#: locale/ipp-strings.c:1528
 msgid "media-source.tray-3"
 msgstr ""
 
 #. TRANSLATORS: Tray 4
-#: locale/ipp-strings.c:1618
+#: locale/ipp-strings.c:1<